Google代码管理器。如何以编程方式阻止加载自定义标记?

时间:2017-08-28 12:23:19

标签: javascript google-tag-manager

我正在使用GTM(Google跟踪代码管理器)的网站上工作。 GTM包含来自我所在国家/地区不允许的网站的一些脚本(标记)。它导致控制台出错,我想停止加载此标记。我无法访问GTM帐户,因此我应该使用js。此脚本为Custom HTML Tag,因为当我尝试下面的代码时,它会停止加载:

    dataLayer = [{
        'gtm.blacklist':['html']
    }];

但它也会停止加载其他自定义标记。 如何以编程方式停止加载某些自定义标记?

2 个答案:

答案 0 :(得分:1)

您无法以编程方式阻止特定的自定义HTML。一个原因是它毫无意义 - "自定义HTML"意味着"在您的网站上下文中执行的任意代码",因此代码可以简单地放入另一个HTML标记并从那里运行。

您无法控制在您的网站中运行的GTM实例(这实际上意味着您无法控制您的网站)并非谷歌可以以任何有意义的方式满足的用例(如果您控制GTM然后只需删除标签)。

如果您想要禁止某个来源的脚本,那么您可以查看Content Security Policies(无论脚本是从GTM运行还是从任何其他来源运行,它都会起作用)。然而,众所周知,CSP很难实现(尽管implement them from within GTM有可能这只适用于有限的测试,而不适用于生产用途。)

答案 1 :(得分:1)

我认为可以做到。查看GTM代码,我们可以看到它使用insertBefore函数将Script元素添加到网站(现在,他们可以随时更改)。所以在理论上你可以添加"一些代码到本机函数并阻止从特定源加载脚本。例如,您可以在加载GTM之前运行以下代码:

Node.prototype.insertBefore = (function() {
    var cached_function = Node.prototype.insertBefore;

    return function(script) {
        if(script && script.src.indexOf("www.somesource.com/script.js") !== -1){ //change to src you don't want to load on your page
            return false; //don't add the script
        }else{
            var result = cached_function.apply(this, arguments); // use .apply() to call native function

            return result;
        }
    };
})();

(代码取自:Adding code to a javascript function programmatically

我没有测试过这段代码,所以我没有建议你在没有经过适当测试的情况下这样做,或者你可能决定不这样做(在你做之前你可能想要阅读:Why is extending native objects a bad practice? )。我同意Eike的回答,但我所说的是,可以防止以编程方式加载自定义标签。