1

在 GTM(Google 跟踪代码管理器)中,您可以拥有自定义 JavaScript 宏,它们是匿名函数,返回标签或规则使用的内容。

我的每个宏都使用 try/catch,因此我们可以轻松地显示任何实现错误(引发由 UA 标记捕获的 dataLayer 事件)

但这里有些奇怪……如果我取消注释 try/catch,GTM 固执地拒绝使用它并且不给出任何错误……但进入了保存模式(即浏览器一直在等待某些东西)。我知道当我在调试控制台中运行这段代码时它可以工作……而且我还有其他具有相同 try/catch 技术的宏……有什么想法吗?

function () {
    /*try {*/
        var v = '';
        // HTML5 video
        if(document.getElementsByTagName('video').length) v += 'video,';
        // Youtube video
        var i = document.getElementsByTagName('iframe');
        for(x = 0; x < i.length; x++)
            if(/youtube.com\/embed/.test(i[x].src)) {
                v += 'youtube,';
                break;
            }
            // Limelight video
        if(document.getElementsByClassName('LimelightEmbeddedPlayer')) v += 'limelight,';
        return v.length ? v.slice(0, -1) : v;
    /*} catch(e) {
        dataLayer.push({
            'event': 'error',
            'action': 'GTM',
            'label': '713-Video Type:' + e.message
        });
    }*/
}
4

1 回答 1

1

您的问题破坏了 JavaScript 语法。For-loop 需要在它周围加上大括号,如果可能的话,总是将它们与 ifs 一起使用。我建议至少不时地使用JSHint来测试你的代码的语法错误。

我修改了你的来源,试试这个:

function () {
    /*try {*/
        var v = '';
        // HTML5 video
        if(document.getElementsByTagName('video').length) {
            v += 'video,';
        }
        // Youtube video
        var i = document.getElementsByTagName('iframe');
        for(var x = 0, l = i.length; x < l; x++) {
            if(/youtube\.com\/embed/.test(i[x].src) && !/youtube/.test(v)) {
                v += 'youtube,';
            }
            // Limelight video
        }
        if(document.getElementsByClassName('LimelightEmbeddedPlayer')) {
            v += 'limelight,';
        }
        return v.length ? v.slice(0, -1) : v;
    /*} catch(e) {
        dataLayer.push({
            'event': 'error',
            'action': 'GTM',
            'label': '713-Video Type:' + e.message
        });
    }*/
}
于 2013-11-26T06:05:32.373 回答