Shoora
5/3/2019 - 5:35 AM

YandexMetrikaReachGoal.js

/**
 * @link https://gist.github.com/zolotykh/3879b7d2354d1de1f57f4b44c4a08821/f30ee1df0be25d619050e312aa2d4ae917330b25
*/

yaTrack(null, 'GOAL_NAME', {key: 'value'}); // во все счетчики
yaTrack(98765431, 'GOAL_NAME'); // в конкретный id счетчика
yaTrack('98\\d65431|87654\\d{3}', 'GOAL_NAME');  // regex
yaTrack(yaCounter987654321, 'GOAL_NAME'); // наиболее безопасен с точки зрения того, что window.Ya._metrika может измениться

// yaTrack возвращает коллбэк для быстрого пуша
// пример получения просто функции для быстрого пуша событий
var quickGoal = yaTrack(yaCounter987654321);
// quickGoal = yaTrack(); // быстрый пуш во все счетчики
quickGoal('GOAL_NAME', {data: 1});

function yaTrack(counterId) {
    "use strict";

    var counters = window.Ya && window.Ya._metrika && window.Ya._metrika.counters || [];
    var args = Array.prototype.slice.call(arguments);
    // var returnCounter = counters.length && window.Ya._metrika.counter;
    var isFirstArgumentRealCounter = counterId && counterId.reachGoal;

    args.shift();

    var trackCounter = function (counter) {
        var dynamicArgs = Array.prototype.slice.call(arguments);

        dynamicArgs.shift();

        var _args = dynamicArgs.length && dynamicArgs || args;

        if (_args.length) {
            counter.reachGoal.apply(counter, _args);
        }
    };

    var trackAllCounters = function () {
        $.each(counters, function (_counterId) {
            var counter = this;

            if (counterId) {
                var regex = new RegExp(counterId);

                if (regex.test(_counterId)) {
                    trackCounter(counter);
                }
            }

            else {
                trackCounter(counter);
            }
        });
    };

    if (isFirstArgumentRealCounter) {
        trackCounter(counterId);
    }

    else {
        trackAllCounters();
    }

    return (function returnCallback() {
        var _args = Array.prototype.slice.call(arguments);

        if (isFirstArgumentRealCounter) {
            _args.unshift(counterId);

            trackCounter.apply(this, _args);
        }

        else {
            _args.unshift(null);

            trackAllCounters.apply(this, _args);
        }

        return returnCallback;
    })
}