Установка целей - сразу для Метрики и Analytics универсальный и простой скрипт целей для Яндекс Метрика и Google Analytics

Установка целей - сразу для Метрики и Analytics
  • 20.10.2020 14:49:12
  • 06.12.2016
  • 4693
  • 3.8
  • 0
  • Константин Винниченко
Я в своих и клиентских проектах на продающих страницах часто использую 2 цели для Директ и AdWords:
  • SEND – любая отправка данных через форму, конверсионная цель.
  • TIME – человек активно провел 40 секунд на сайте, цель для ретаргетинга и измерения качества трафика.
Для этого разработал простой скрипт, который облегчает установку и теперь делюсь с посетителями моего блога. Данный скрипт будет еще дорабатываться и все изменения будут доступны в этой же статье. Так же жду ваших комментариев для улучшения данного скрипта.

Поясню подробнее о данных целях

Цель SEND вешается каждые 5 секунд на формы заявок в которых присутствует тег FORM, такая частота необходима для таких случаев, когда форма генерируется автоматически. Например: всплывающие окна обратных звонков или онлайн-чат. Но не будет работать, если на форме отправки данных отсутствует тег FORM или/и данные формы отправляются методом JavaSctript.
Цель TIME срабатывает после 40 секунд (это значение можно поменять) активного посещения, то есть счетчик начнет срабатывать после того, как человек выполнил клик или прокрутку на сайте и отключается, если человек ушел со страницы и продолжает отчет, когда, не закрывая вкладу вернулся к вам и продолжает изучать вашу страницу. Можно сказать, эта цель имитирует «отказ», если она не была достигнута.

Установка скрипта на цели TIME и SEND

Итого, установка скрипта, добавляет следующие цели события в Яндекс.Метрике:
SENDall – составная цель в виде воронки в один шаг, объединяет все конверсионные формы SEND + внешние цели от сервисов сбора контактных данных, таких как: онлайн-чат, заказ звонка, ловец лидов.
SEND – срабатывает, когда клиент отправляет контактную информацию, обычно через встроенные формы на сайте. Может срабатывать на посещение целевых страниц означающих заявку, перехватывает конверсионные цели с внешних сервисов
TIME – срабатывает после 40 секунд (опционально) активного просмотра одной страницы, где учитывая активность браузера, прокрутка страницы, выделение, клики
FORM – человек начал заполнять конверсионную форму перед достижением цели SEND
SPAM – цель срабатывает, когда SEND был оставлен быстрее TIME, не срабатывает для конверсионных страниц
ERROR - цель срабатывает при посещении битой страницы 404 Not Found / Ресурс не найден
CLICK_TEL – клик по ссылке с номером телефона
CLICK_EMAIL – клик по ссылке с email адресом
CLICK_MES – клик по мессенджерам
CLICK_SOC – клик по социальным ссылкам
CLICK_ORDER – клик по произвольному элементу согласно заданному условию в скрипте
GOOD – цель отражает полезное действие на сайте, любое срабатывание из целей SEND, FORM, CLICK_TEL, CLICK_EMAIL, CLICK_MES

Воронка SCROLL в виде следующих шагов:
SCROLL25 – прокрутка от 25% страницы сайта
SCROLL50 – прокрутка от 50% страницы сайта
SCROLL75 – прокрутка от 75% страницы сайта
SCROLL100 – прокрутка от 100% страницы сайта

Дополнительно настраиваются цели на посещение страниц:
PAGE – просмотр 3 и более страниц
CART – посещение страницы «Корзина»
CONTACT – посещение страницы «Контакты»

Воронка продаж для интернет-магазинов, по шагам с примерами:
1. Просмотр сайта (url-содержит / )
2. Просмотр корзины (url-содержит /cart/ )
3. Оформление заказа (url-содержит /order/ )
4. Спасибо за заказ (url-содержит ORDER_ID= )

Быстрый импорт целей в Google Аналитика

Устанавливаем код перед закрывающем тегом </BODY> после установки счетчиков:
 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<!-- Универсально от SeoUp.su цели TIME и SEND -->
<script type="text/javascript">
    setTimeout(function () {
        var ymNumber = "XXXXX";
        var gaNumber = "UA-XXXX-X";
        var ymCreate = true;
        var gaCreate = true;
        var bDebug = true;
        var bDebugAlert = false;
        var fForm = "FORM,#form,.form";
        var bFormSEND = true;
        var fRequired = ".tel,#tel,.phone,#phone,INPUT[name='tel'],INPUT[name='phone']";
        var bRequired = true;
        var fBut = "";
        var fClickORDER = ".egoal";
        var fClickSOC = ".b24-widget-button-social-item,[href*='tele.click'],[href*='vk.me'],[href*='vk.com'],[href*='instagram.com'],[href*='ok.ru'],[href*='facebook.com'],[href*='twitter.com'],[href*='youtube.com'],[href*='telegram.org'],[href*='odnoklassniki.ru'],[href*='plus.google.com'],[href*='my.mail.ru']";
        var fClickMES = "[href^='tg:'],[href^='whatsapp:'],[href^='skype:'],[href^='viber:'],[href*='whatsapp.com'],[href*='wa.me'],[href*='t.me'],[href*='telegram.me']";
        var rUrlSucces = /orderID=\d*|tilda\/form\d*\/submitted/;
        var rAjaxUrl = null;
        var rAjaxData = null;
        var rAjaxResponse = null;
        var sAutoGoalSEND = "UNIQUE_LEAD,Jivo_Offline_message_sent,Jivo_In-chat_email_form_submitted,Jivo_User_gave_contacts_during_chat,Jivo_Callback_requested,RedHelper.Message_sent,RedConnect.callOrdered,CHAT_OFFLINE_MESSAGE,CHAT_VISITOR_INTRODUCED,Chatra_Pre-chat_form_submitted,LEADBACK_CALL,LEADBACK_CHAT_LEAD,LEADBACK_CHAT_OFFLINE_LEAD,MeTalk_Offline_message_sent,MeTalk_Form_submited,MeTalk_User_gave_contacts_before_chat,MeTalk_User_gave_contacts_during_chat,Callbackhunter_CALL,Callbackhunter_CALL_MOBILE";
        var fMask = "INPUT[name='tel']";
        var sMask = "+9(999)999-99-99";
        var secMax = 40;
        var sNoClass = "fsend";
        var priceTIME = 0;
        var priceSEND = 0;
        /* далее переменные не менять */
        var cVersion = '23.09.2020';
        var secCur = 0;
        var bDebugStatus = false;
        var bMen = false;
        var bFocus = false;
        var sBuf = '';
        var sTimId = '';
        var bGOAL = {
            "SCROLL25": false,
            "SCROLL50": false,
            "SCROLL75": false,
            "SCROLL100": false,
            "FORM": false,
            "GOOD": false,
        };

        function eventGoal(eg, ec) {
            var ale = true;
            if (jQuery.inArray(eg, ["TIME", "SCROLL25", "SCROLL50", "SCROLL50", "SCROLL75", "SCROLL100", "FORM", "SPAM", "GOOD"]) > -1)
                ale = false;

            if (ymNumber != "") {
                try {
                    ym(ymNumber, 'reachGoal', eg);
                    consoleAlert("Сработал " + eg + " для YM", ale);
                } catch (e) {
                    consoleAlert("ОШИБКА отправки " + eg + " для YM через ym().\n" + e, ale);
                    try {
                        yaCounter999999.reachGoal(eg); //прописать номер для старой метрики
                        consoleAlert("Сработал " + eg + " для YM", ale);
                    } catch (e) {
                        consoleAlert("ОШИБКА отправки " + eg + " для YM через yaCounterXXX().\n" + e, ale);
                    }
                }
            }
            if (gaNumber != "") {
                try {
                    gtag('event', 'event_name', {'event_category': 'SEOUP', 'event_action': eg});
                    consoleAlert("Сработал " + eg + " для GA", ale);
                } catch (e) {
                    consoleAlert("ОШИБКА отправки " + eg + " для GA через gtag().\n" + e, ale);
                    try {
                        ga("send", "event", "SEOUP", eg);
                        consoleAlert("Сработал " + eg + " для GA", ale);
                    } catch (e) {
                        consoleAlert("ОШИБКА отправки " + eg + " для GA через ga().\n" + e, ale);
                    }
                }
            }
            if (ec > 0) {
                window.dataLayer.push({
                    "ecommerce": {
                        "currencyCode": "RUB",
                        "purchase": {
                            "actionField": {
                                "id": "auto"
                            },
                            "products": [
                                {
                                    "id": 1,
                                    "name": eg,
                                    "price": ec,
                                    "category": "SEOUP/" + eg
                                }
                            ]
                        }
                    }
                });
                consoleAlert("ЦЕНА " + eg + "=" + ec, false);
            }
            if (!bGOAL["GOOD"]) {
                if (jQuery.inArray(eg, ["FORM", "SEND", "CLICK_TEL", "CLICK_EMAIL", "CLICK_MES"]) > -1) {
                    bGOAL["GOOD"] = true;
                    eventGoal('GOOD', 0);
                }
            }
            return true;
        }

        /* code.google.com/archive/p/jscookie/ */
        window.cookie = {
            set: function (key, value, expires, path, domain, secure) {
                var sCookie = key + '=' + escape(value) + '; ';
                if (expires !== undefined) {
                    var date = new Date();
                    date.setTime(date.getTime() + (expires * 60 * 60 * 1000));
                    sCookie += 'expires=' + date.toGMTString() + '; ';
                }
                sCookie += (path === undefined) ? 'path=/;' : 'path=' + path + '; ';
                sCookie += (domain === undefined) ? '' : 'domain=' + domain + '; ';
                sCookie += (secure === true) ? 'secure; ' : '';
                document.cookie = sCookie;
            },
            get: function (sKey) {
                var sValue = '';
                var sKeyEq = sKey + '=';
                var aCookies = document.cookie.split(';');
                for (var iCounter = 0, iCookieLength = aCookies.length; iCounter < iCookieLength; iCounter++) {
                    while (aCookies[iCounter].charAt(0) === ' ') {
                        aCookies[iCounter] = aCookies[iCounter].substring(1);
                    }
                    if (aCookies[iCounter].indexOf(sKeyEq) === 0) {
                        sValue = aCookies[iCounter].substring(sKeyEq.length);
                    }
                }
                return unescape(sValue);
            },
            remove: function (key) {
                cookie.set(key, '', -1);
            },
            clear: function () {
                var aCookies = document.cookie.split(';');

                for (var iCounter = 0, iCookieLength = aCookies.length; iCounter < iCookieLength; iCounter++) {
                    while (aCookies[iCounter].charAt(0) === ' ') {
                        aCookies[iCounter] = aCookies[iCounter].substring(1);
                    }
                    var iIndex = aCookies[iCounter].indexOf('=', 1);
                    if (iIndex > 0) {
                        cookie.set(aCookies[iCounter].substring(0, iIndex), '', -1);
                    }
                }
            },
            isEnabled: function () {
                cookie.set('test_cookie', 'test');
                var val = (cookie.get('test_cookie') === 'test') ? true : false;
                cookie.remove('test_cookie');
                return val;
            }
        };
        function parseURLget(g) {
            var regexp = new RegExp(g + '=([^&]+)', 'i');
            var GetValue = '';
            if (!!regexp.exec(document.location.search))
                GetValue = regexp.exec(document.location.search)[1];
            return GetValue;
        }

        if (bDebug) {
            sBuf = parseURLget('slog');
            if (sBuf == '0') {
                bDebugStatus = false;
                cookie.remove('_ym_debug');
                console.log('SEOUP_GOAL: Выключена отладка целей для этого браузера.');
            } else {
                if (sBuf == '1') {
                    bDebugStatus = true;
                    cookie.set('_ym_debug', '1');
                    console.log('SEOUP_GOAL: В этом браузере включена визуальная отладка целей.');
                }
            }
        }
        sBuf = cookie.get('_su_secCur');
        if (sBuf != '') {
            secCur = Number(sBuf);
        }
        if ((priceTIME > 0) || (priceSEND > 0)) {
            window.dataLayer = window.dataLayer || [];
        }
        if ((gaCreate) && (gaNumber != "")) {
            var scGA1 = document.createElement("script");
            scGA1.setAttribute("type", "text/javascript");
            scGA1.setAttribute("src", "https://www.googletagmanager.com/gtag/js?id=" + gaNumber);
            document.head.appendChild(scGA1);
            var scGA2 = document.createElement("script");
            scGA2.setAttribute("type", "text/javascript");
            scGA2.innerHTML = "window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('config', '" + gaNumber + "');";
            document.head.appendChild(scGA2);
        }
        if ((ymCreate) && (ymNumber != "")) {
            (function (m, e, t, r, i, k, a) {
                m[i] = m[i] || function () {
                        (m[i].a = m[i].a || []).push(arguments)
                    };
                m[i].l = 1 * new Date();
                k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a)
            })
            (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
            ym(ymNumber, "init", {
                clickmap: true,
                trackLinks: true,
                accurateTrackBounce: true,
                webvisor: true,
                trackHash: true,
                ecommerce: "dataLayer"
            });
        }
        if (fMask != "") {
            var scMI = document.createElement("script");
            scMI.setAttribute("src", "https://seoup.su/api/jquery.maskedinput.min.js");
            scMI.setAttribute("type", "text/javascript");
            document.head.appendChild(scMI);
        }
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("HEAD", document.location, true);
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 404)
                    eventGoal('ERROR', 0);
            }
        };
        xmlhttp.send(null);
        function consoleAlert(text, aler) {
            if (bDebugStatus) {
                console.log("SEOUP_GOAL: " + text);
                if ((aler) && (bDebugAlert)) {
                    alert(text);
                }
            }
            return true;
        }

        function formCheck(form) {
            var bOk = true;
            var i = 0;
            if (fRequired != "") {
                fInput = jQuery(fRequired, form);
                consoleAlert("Нашли элементы ввода по шаблону " + fInput.length + " шт.:", false);
                var vErr = false;
                for (i = 0; i < fInput.length; i++)
                    if (fInput[i].value == "") {
                        vErr = true;
                        break;
                    }
                if (vErr) bOk = false;
            }
            if (bOk) {
                eventGoal('SEND', priceSEND);
                if (secCur <= secMax) {
                    consoleAlert("Заявку через FORM оставили слишком быстро, за " + secCur + " сек.", false);
                    eventGoal('SPAM', 0);
                }
            }
            else consoleAlert("Не сработал SEND, есть пустые элементы INPUT", true);
            return true;
        }

        function formEvent() {
            if (jQuery(fForm).length > 0) {
                var findNewFrom = false;
                if (!jQuery(fForm).hasClass(sNoClass)) {
                    findNewFrom = true;
                    jQuery(fForm).addClass(sNoClass);
                    if (fMask != "") {
                        jQuery(fMask, fForm).mask(sMask);
                    }
                }
                if ((bDebugStatus) && (bDebug)) {
                    jQuery(fForm).attr("style", "border: 2px dashed #f00; margin: -2px;");
                    jQuery(fRequired, fForm).attr("style", "border: 2px dashed #9f0; margin: -2px;");
                    jQuery(fBut, fForm).attr("style", "border: 2px dashed #03f; margin: -2px;");
                    if (findNewFrom) {
                        consoleAlert("Нашли формы для события SEND", false);
                    }
                }
                if (bGOAL["FORM"] == false) {
                    jQuery(fForm).off('change.seoup');
                    jQuery(fForm).on('change.seoup', function () {
                        eventGoal('FORM', 0);
                        bGOAL["FORM"] = true;
                        jQuery(fForm).off('change.seoup');
                        return true;
                    });
                }
                if (bFormSEND) {
                    if (fBut != "") {
                        jQuery(fBut, fForm).off('click.seoup');
                        jQuery(fBut, fForm).on('click.seoup', function () {
                            formCheck(this.closest(fForm));
                            return true;
                        });
                    }
                    jQuery(fForm).off('submit.seoup');
                    jQuery(fForm).on('submit.seoup', function () {
                        formCheck(this);
                        return true;
                    });
                }
            }
            return true;
        }

        function funcYM() {
            var yCounter = 0;

            function ySearch() {
                if (window.ym) {
                    window.zm = window.ym;
                    mainTagFunction();
                } else if (yCounter < 100) {
                    setTimeout(ySearch, 100);
                    yCounter++;
                } else consoleAlert("ОШИБКА: новый счетчик Яндекс.Метрики не найден для перехвата целей.", false);
            }

            function mainTagFunction() {
                window.ym = function () {
                    window.zm.a.push(arguments);
                    if (arguments[1] == 'reachGoal') {
                        if (jQuery.inArray(arguments[2], arrGoal) > -1) {
                            eventGoal('SEND', priceSEND);
                        }
                    }
                };
            }

            if (sAutoGoalSEND != '') {
                arrGoal = sAutoGoalSEND.split(',');
                ySearch();
            }
        }

        if (rUrlSucces != "") {
            if (window.location.href.search(rUrlSucces) + 1) {
                eventGoal('SEND', priceSEND);
            }
        }
        jQuery.ajaxSetup({global: true});
        jQuery(document).ajaxSuccess(function (event, request, settings) {
            if ((bDebugStatus) && (bDebug)) {
                consoleAlert('ajaxSuccess url: ' + settings.url + ' ; data: ' + settings.data + ' ; responseText: ' + request.responseText, false);
            }
            var bOK = false;
            if ((rAjaxUrl != null) && (!bOK)) {
                if (settings.url.search(rAjaxUrl) + 1) {
                    bOK = true;
                }
            }
            if ((rAjaxData != null) && (!bOK)) {
                if (settings.data.search(rAjaxData) + 1) {
                    bOK = true;
                }
            }
            if ((rAjaxResponse != null) && (!bOK)) {
                if (request.responseText.search(rAjaxResponse) + 1) {
                    bOK = true;
                }
            }
            if (bOK) {
                eventGoal('SEND', priceSEND);
                if (secCur <= secMax) {
                    consoleAlert("Заявку через AJAX оставили слишком быстро, за " + secCur + " сек.", false);
                    eventGoal('SPAM', 0);
                }
            }
            formEvent();
        });
        jQuery(document).ready(function () {
            sBuf = '';
            if (ymNumber != "") sBuf = " YM=" + ymNumber;
            if (gaNumber != "") sBuf = sBuf + " GA=" + gaNumber;
            sBuf = "SEOUP_GOAL: Библиотека jQuery " + jQuery.fn.jquery + " - Цели от " + cVersion + " работают для" + sBuf + ", где TIME=" + secMax;
            if (bFormSEND) {
                if (fRequired == "") sBuf = sBuf + " и SEND срабатывает при любой отправке " + fForm;
                else sBuf = sBuf + " и SEND срабатывает только в \"" + fForm + "\" с данными \"" + fRequired + "\"";
                if (fRequired) {
                    if (bRequired) {
                        jQuery(fRequired, fForm).attr("required", true);
                        sBuf = sBuf + " обязательное";
                        if (fBut != "") {
                            sBuf = sBuf + " с кнопкой \"" + fBut + "\"";
                        }
                    }
                    if (fMask != "") {
                        sBuf = sBuf + " и маска " + sMask;
                    }
                }
            }
            if (bDebug) {
                sBuf = sBuf + ". Отладка ?slog=1";
                if (bDebugAlert) {
                    sBuf = sBuf + " и Alert вклюючен (не рекомендуется используйте \"Preserve log\" в консоли).";
                    if (bDebugStatus) {
                        sBuf = sBuf + "\n\nВключен режим отладки c alert() - по завершению обязательно поставить bDebugAlert=false;";
                        console.log(sBuf);
                    }
                }
                console.log(sBuf);

            } else {
                console.log(sBuf + ". Отладка недоступна.");
            }
            sTimId = setInterval(function () {
                if ((bMen == true) && (bFocus == true)) {
                    if (secCur >= secMax) {
                        secCur = secMax;
                        cookie.set('_su_secCur', secCur, 1);
                        clearTimeout(sTimId);
                        eventGoal('TIME', priceTIME);
                    } else {
                        secCur = secCur + 1;
                        cookie.set('_su_secCur', secCur, 1);
                        if ((bDebugStatus) && (bDebug)) {
                            consoleAlert('TIME = ' + secCur + ' из ' + secMax, false);
                        }
                    }
                }
            }, 1000);
            if ((bDebugStatus) && (bDebug)) {
                jQuery('[href^="mailto:"],[href^="tel:"]').attr("style", "border: 2px dashed #f0d; margin: -2px;");
                if (fClickORDER != "") {
                    jQuery(fClickORDER).attr("style", "border: 2px dashed #f0d; margin: -2px;").attr("goal", "CLICK_ORDER");
                }
                if (fClickSOC != "") {
                    jQuery(fClickSOC).attr("style", "border: 2px dashed #f0d; margin: -2px;").attr("goal", "CLICK_SOC");
                }
                if (fClickMES != "") {
                    jQuery(fClickMES).attr("style", "border: 2px dashed #f0d; margin: -2px;").attr("goal", "CLICK_MES");
                }
            }
            jQuery('[href^="mailto:"]').click(function (e) {
                eventGoal('CLICK_EMAIL', 0);
                return true;
            });
            jQuery('[href^="tel:"]').click(function (e) {
                eventGoal('CLICK_TEL', 0);
                return true;
            });
            if (fClickORDER != "") {
                jQuery(fClickORDER).click(function (e) {
                    eventGoal('CLICK_ORDER', 0);
                    return true;
                });
            }
            if (fClickSOC != "") {
                jQuery(fClickSOC).click(function (e) {
                    eventGoal('CLICK_SOC', 0);
                    return true;
                });
            }
            if (fClickMES != "") {
                jQuery(fClickMES).click(function (e) {
                    eventGoal('CLICK_MES', 0);
                    return true;
                });
            }
            if (fForm != "") {
                setInterval(function () {
                    formEvent()
                }, 2000);
            }
            jQuery(window).focus();
            setTimeout(funcYM, 1000);
        });
        jQuery("body").click(function () {
            bMen = true;
            bFocus = true;
        });
        jQuery(window).scroll(function () {
            bMen = true;
            bFocus = true;
            var sscroll = jQuery(window).scrollTop();
            var sheight = jQuery(document).height() - jQuery(window).height();
            var dch = sscroll / sheight * 100;
            var pscroll = Math.round(dch);
            if ((pscroll >= 25) && (!bGOAL["SCROLL25"])) {
                bGOAL["SCROLL25"] = true;
                eventGoal('SCROLL25', 0);
            }
            if ((pscroll >= 50) && (!bGOAL["SCROLL50"])) {
                bGOAL["SCROLL50"] = true;
                eventGoal('SCROLL50', 0);
            }
            if ((pscroll >= 75) && (!bGOAL["SCROLL75"])) {
                bGOAL["SCROLL75"] = true;
                eventGoal('SCROLL75', 0);
            }
            if ((pscroll == 100) && (!bGOAL["SCROLL100"])) {
                bGOAL["SCROLL100"] = true;
                eventGoal('SCROLL100', 0);
            }
        });
        jQuery(window).bind("focus", function () {
            bFocus = true;
        });
        jQuery(window).bind("blur", function () {
            bFocus = false;
        });
    }, 1000);
</script>
Если нужно добавить еще несколько целей по клику, то рекомендуется использовать следующий шаблон внутри функции jQuery(document).ready
jQuery('СЕЛЕКТОР1').click(function (e) {
eventGoal('ИМЯ_ЦЕЛИ1', 0);
});

Описание переменных и настройка

  1. ymNumber (""|"9876543210") - номер Яндекс.Метрики для передачи конверсий
  2. gaNumber (""|"UA-9876543210") - номер Google Аналитики для передачи конверсий
  3. ymCreate (true|false) - создать счетчик Yandex Metrika скриптом
  4. gaCreate (true|false) – создать счетчик Google Analytics скриптом
  5. bDebug(true|false) - разрешить режим отладки в консоли при посещении c параметром ?slog=1 во время настройки стоит использовать true и когда за закончена отладка выключать в целях безопасности
  6. bDebugAlert(true|false) - разрешить срабатывать alert() при срабатывании редко уловимых целей в режиме отладки
  7. fForm (jQuery селекторы) - выделение контейнера в качестве конверсионной формы для срабатывания FORM при изменении
  8. bFormSEND (true|false) - включить передачу цели SEND при отправки с конверсионных форм fForm
  9. fRequired (jQuery селекторы) - если bRecSEND работает и есть выборка fForm идет проверка значений полей INPUT, которые должны быть обязательно заполнены перед отправкой для срабатывания цели SEND
  10. bRequired(true|false) - если fRequired и bRequired true, тогда на уровне браузера данные INPUT обязательны к заполнению, что позволяет избежать часть ошибок перед отправкой формы
  11. fBut (""|jQuery селекторы) - если значение не пустое, тогда идет срабатывание SEND просто по клику на кнопку внутри fForm, применять метод в последнюю очередь когда другие методы перехвата не работают
  12. fClickORDER (""|jQuery селекторы) - если значение не пустое, тогда идет срабатывание SEND просто по клику на выделенный элемент.
  13. fClickSOC(""|jQuery селекторы) - селекторы определяющие цель CLICK_SOC клик по социальным ссылкам.
  14. fClickMES(""|jQuery селекторы) - селекторы определяющие цель CLICK_MES клик по мессенджерам.
  15. rUrlSucces (null|регулярные выражения JS) - если значение не null, тогда идет поиск соответствия регулярному выражению по URL и срабатывает цель SEND при истинном значении вне зависимости от bRecSEND
  16. rAjaxUrl (null|регулярные выражения JS) - при отправке AJAX идет поиск по URL куда эти данные отправляются и если соответствует выражению, срабатывает SEND вне зависимости от bFormSEND и все AJAX срабатывают по условию ИЛИ
  17. rAjaxData(null|регулярные выражения JS) - при отправке AJAX идет поиск по отправляемым данным с форм и если соответствует выражению, срабатывает SEND вне зависимости от bFormSEND
  18. rAjaxResponse(null|регулярные выражения JS) - при отправке AJAX идет поиск по полученным данным с сервера и если соответствует выражению, срабатывает SEND вне зависимости от bFormSEND
  19. sAutoGoalSEND - перечисление через запятую, какие цели перехватываем с новой Яндекс.Метрики и дублируем конверсию в SEND
  20. fMask (""|jQuery селекторы) - если значение не пустое, то применяется маска к заполнению INPUT, обычно используется для номера телефона
  21. fMask("+9999-999-9999") - шаблон маски к заполнению INPUT при непустом fMask
  22. secMax (40) - число секунд до срабатывания цели TIME, обнуляется с каждым новым посещением
  23. sNoClass("fsend") - имя класса, которое будет добавляться к fForm чтобы исключить уже известные формы и поймать новые динамические формы через каждые 2 секунды
  24. priceTIME(0) - указываем больше 0 если точно знаем ценность данной цели и хотим видеть данные в отчетах по электронной коммерции, лучше не использовать совместно с priceSEND
  25. priceSEND(0) - указываем больше 0 если точно знаем ценность данной цели и хотим видеть данные в отчетах по электронной коммерции, лучше не использовать совместно с priceTIME
  26. bDebugStatus(false) - указываем true для принудительного включения режима отладки, в случаях когда slog=1 не срабатывает, по завершению обязательно возращаем значение false

Популярные примеры jQuery селекторов и регулярных выражений JavaScript для цели SEND

Примеры jQuery селекторов
  • "form,#form,.form" – выбрать все теги FORM, все теги с ID #form, все теги с классом .form
  • "FORM:not(#uptocall-form, #uptocall-form-email, #search, .search, #subscribe, .subscribe, #smartfilter, .smartfilter, #login, .login)" – выбрать все теги FORM кроме #uptocall-form, #uptocall-form-email и т.д.
  • "FORM:has(.seoup, .feedback)" – выбрать только теги FORM с классом .seoup, .feedback. Аналог "FORM.seoup, FORM.feedback"
  • "#myinput\\[3\\]" – выбрать элемент у которого ID с квадратными скобками "myinput[3]"
  • "FORM[action=\\/\\#wpcf7-f4349]" - выбрать FORM у которой атрибут action="/#wpcf7-f4349"

Примеры регулярных выражений JS:

  •  /12a45/ - строка содержит «12a45» в любом месте
  • /^12a45/ - строка начинается с «12a45»
  • /12a45$/ - строка заканчивается на «12a45»
  • /^12a45$/ - строка строго «12a45»
  • /^\[null,{"ok":1}]$/ - строка строго «[null,{"ok":1}]»
  • /^45678$|^12a45$/ - перечисление вариантов поиска символом «|»
  • /input_phone=.{5,}&input_email/ - строка имеет «input_phone=» и «input_email» между которыми 5 и более символов, это по логике означает заполненное поле input_phone
  • /order((?!edit).)*\/$/ - для страницы «site.ru/order/» работает, а для «site.ru/order/edit/» не работает
  • /order.*thank/ - для страницы «site.ru/order/» не работает, а для «site.ru/order/thank» работает
  • /\d{3}-\d{3,5}-\D{4}/ - выбирает числа разбитые через дифис сначала 3 числа, потом дефис, потом 3-5 чисел, потом дефис, 4 символа все кроме цифр
Проверяйте работоспособность регулярных выражений - https://regex101.com

Тестируем цели и исправляем ошибки

1. После установки открываем сайт и смотрим лог консоли, если надпись "Установлены цели TIME и SEND" появилась, то скорее всего цели работают.
2. Скрипт может не работать, если не подключена библиотека jQuery
<script src="//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
3. В Яндекс.Метрика есть специальный тег, с которым открываешь страницу и смотришь логи отчета и Метрика отобразит свои действия по конверсиям
site.ru?_ym_debug=1
Подсказка: кстати так можно определить достигаемые цели от сервисов обратного звонка и онлайн-консультантов. Выполняете заявку, пишите сообщение и смотрите какая цель отобразилась, данное имя можете добавить в счетчик и буде собирать по данной цели конверсии и статистику.
4. Если не получается выделить нужный тег, попробуйте в консоли найти нужную комбинацию в селекторах
jQuery("*[data-type='phone'] input").attr("style", "border: 2px dashed #ff0; margin: -2px;");
5. Если скрипт установили, а счетчики не поставили, цели работать не будут.
6. Желательно скрипт ставить после вызова счетчиков, если цель универсального скрипта сработает раньше, чем загрузиться счётчик то будет ошибка.
7. Если JavaScript отключен в браузере, скрипт работать не будет. Крайне редкий случай.
8. Если счетчики слежения блокируют антивирусы, то скрипт так же работать не будет.
9. Проверяйте корректность срабатывания, когда срабатывает лишний раз, есть вероятность в поле INPUT может быть уже заполнено VALUE

Все корректно, а целей в отчете нет?

В Яндекс.Метрика обычно требуется 15-40 минут, чтобы она отобразила достижение цели в своих отчетах
В Яндекс.Директ обычно требуется 1-2 дня, чтобы из отчета «Все цели» появились уже имена конкретных целей SEND и TIME. Яндекс.Директ предварительно надо связать с Яндекс.Метрика.
В Google Analytics в режиме реального времени может отобразить цель, задержка 3-15 секунд
В Google AdWords обычно требуется 2-3 для показа целей. Google AdWords предварительно надо связать с Google Analytics

Полезно прочесть


Оценить статью

Рейтинг:
(3.83 из 5 - 6 голосов)