Как изменить тег встроенного скрипта внизу страницы до его запуска - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть страница с благодарностью за электронную торговлю, которая отправляет хит ecommerce.js в Google Analytics

<script>
        try{ga('require', 'ecommerce', 'ecommerce.js');
        ga('ecommerce:addTransaction', {
            'id': '082918-074143-128'
            , 'affiliation': ''
            , 'revenue': '2.09'
            , 'shipping': '0.00'
            , 'tax': '0.17'
        });ga('ecommerce:addItem',{ 
            'id': '082918-074143-128'
            , 'sku': ''
            , 'name': 'Cane Creek 1-1/8-inch Headset Shim Spacer .25mm'
            , 'category': 'Bicycling Catalog > Components > Headsets'
            , 'price': '1.08'
            , 'quantity': '1'
        });

        ga('ecommerce:addItem',{ 
            'id': '082918-074143-128'
            , 'sku': ''
            , 'name': 'Race Face X-Type BB Outer Race Seal Gray'
            , 'category': 'Bicycling Catalog > Components > Other > Other'
            , 'price': '0.84'
            , 'quantity': '1'
        }); ga('ecommerce:send');}catch(err){}
</script> 

Я хочу изменить этот скрипт, прежде чем он отправит данные в GA, удалив первую и последнюю строки, а также изменив код, изменив строку 'ga(' на 'ga1(' так что код не будет отправлять данные в GA. и вместо этого я могу вместо этого отправить расширенную электронную коммерцию.

Я вставил следующий скрипт выше на страницу, чтобы он редактировал тег ниже на странице, но он не может редактировать тег до его запуска.

Я пробовал это:

<script>
  document.addEventListener("DOMContentLoaded", function(event) {

    function contains(selector, text) {
        var elements = document.querySelectorAll(selector);
        return [].filter.call(elements, function(element){
            return RegExp(text).test(element.textContent);
        });
    }
    function bsHit() {
        gaHit = contains('script', /try\{ga\(/g);
        var hit = gaHit[0].innerHTML;
        var tryer = "try{ga('require', 'ecommerce', 'ecommerce.js')\;";
        var hit = hit.replace(tryer, "");
        lastLine = "ga('ecommerce:send');}catch(err){}";
        hit = hit.replace(lastLine, "");
        hit = hit.replace(/ga\(/g,"ga1\(");
        console.log(hit);
    }

    bsHit();
  }
</script>

Что мне нужно / изменить в моем коде, чтобы это произошло?

Я ценю ваше время и понимание.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Не могли бы вы просто временно заглушить функцию ga чем-то другим?

window.ga1 = window.ga;
window.ga = function(){};
setTimeout(function(){ window.ga = window.ga1; }, 3000);
0 голосов
/ 04 сентября 2018

Попробуйте код ниже. Я не совсем понимаю, что делает ваша функция «содержит», поэтому я не могу ручаться за это. В любом случае, если вы используете расширение хрома отладчика GA, вы сможете увидеть, выполняется ли ваш код раньше автоматически сгенерированного кода, и устранить неполадки оттуда.

<script>
(function() { //this wraps your sript in an IIFE, which will execute as soon as it's parsed

	function contains(selector, text) {
		var elements = document.querySelectorAll(selector);
		return [].filter.call(elements, function(element) {
			return RegExp(text).test(element.textContent);
		});
	}

	function bsHit() {
		var gaHit = contains('script', /try\{ga\(/g);
		var hit = gaHit[0].innerHTML;
		hit = hit.replace("ga('ecommerce:send')", "");
		gaHit[0].innerHTML = hit; //var hit is just a string - you need to rewrite the script element
		console.log("Replaced script content:\n" + hit); //added string so it will show up on console even if 'hit' is null
	}

	bsHit();
})();
</script>
...