Javascript 如何在触发内联脚本标记之前将其进一步更改到页面下方

Javascript 如何在触发内联脚本标记之前将其进一步更改到页面下方,javascript,google-analytics,e-commerce,enhanced-ecommerce,Javascript,Google Analytics,E Commerce,Enhanced Ecommerce,我有一个电子商务感谢页面,它正在向Google Analytics发送一个ecommerce.js点击 <script> try{ga('require', 'ecommerce', 'ecommerce.js'); ga('ecommerce:addTransaction', { 'id': '082918-074143-128' , 'affiliation': '' , 'r

我有一个电子商务感谢页面,它正在向Google Analytics发送一个ecommerce.js点击

<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> 
我需要在代码中修改什么才能实现它


感谢您的时间和见解。

请尝试下面的代码。我不完全理解你的“contains”函数在做什么,所以我不能保证这一点。在任何情况下,如果您使用GA调试器chrome扩展,您应该能够看到您的代码是否在自动生成的代码之前执行,并从那里进行故障排除


(function(){//将sript封装在IIFE中,解析后立即执行
函数包含(选择器、文本){
var元素=document.querySelectorAll(选择器);
return[].filter.call(元素,函数(元素){
返回RegExp(text.test)(element.textContent);
});
}
函数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只是一个字符串-您需要重写脚本元素
log(“替换的脚本内容:\n”+hit);//添加了字符串,这样即使“hit”为空,它也会显示在控制台上
}
bsHit();
})();

您能暂时用其他东西来存根ga函数吗

window.ga1=window.ga;
window.ga=函数(){};

setTimeout(function(){window.ga=window.ga1;},3000);
为什么要用脚本重写第一个块,而不仅仅是编辑它?如果是“编辑”,您的意思是,在服务器上,第一个脚本是由电子商务平台自动生成的,我不能手动更改它。我希望可以!好的,DOMContentLoaded事件不会在任何脚本执行之前发生(请参阅),因此这不起作用。您可以尝试将代码包装到立即调用的函数表达式中,而不是事件侦听器中。此外,我不明白为什么需要所有三个替换语句。将“ga('ecommerce:send')”替换为“”就可以了。在这里使用equals将ga1分配给与ga相同的对象,这意味着当您更改ga时,ga1的值将发生变化。您需要克隆ga才能使其工作。此外,这可能会阻止页面视图或事件跟踪工作。如果我将您的代码块放在ecommerce.js命中上方,它仍会在我之前执行电子商务命中t被修改。哦,好吧。想想看,我不明白这是怎么可能的。当脚本被加载时,它会被执行,所以你不能在执行之前在DOM中编辑它。你不能在视图中启用增强的电子商务,然后添加你自己的标记吗?当你这样做时,传统的电子商务报告就消失了,不是吗?如果这不起作用,一些版本DenverMatt的想法似乎是你最好的选择,但如果你不能在脚本执行之前修改它,这也不会起作用。如果我把你的代码块放在ecommerce.js点击上方,第一个脚本就找不到了,也找不到脚本(我想是因为它还没有加载到dom中)chrome返回错误:
Uncaught TypeError:无法读取未定义的属性'innerHTML'。
这里有一个例子来显示错误。我启用了增强型电子商务,并且我得到了增强型电子商务数据,除了购买数据的详细信息。这是空白。我的电子商务点击发送了正确的数据,但我认为问题出在哪里m是在同一个页面上同时有一个ecommerce.js hit和一个ec.js。谷歌说要避免这一点,这就是为什么我试图禁用ecommerce.js hit。不确定是否在同一个页面上同时有这两个。无论如何,我的解决方案不会按照我之前的评论工作。
<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>