对讲机 ECMASCRIPT6 标签管理器错误
Intercom ECMASCRIPT6 Tag Manager Error
我之前使用 Google 标签管理器成功设置了对讲机。几个月没碰它了,去制作一个新标签,但我收到来自内部通信标签的错误:
Error at line 6, character 243: this language feature is only supported for ECMASCRIPT6 mode or better: block-scoped function declaration. Use --language_in=ECMASCRIPT6 or ECMASCRIPT6_STRICT or higher to enable ES6 features.
我的对讲脚本自最初运行以来没有改变:
<script>
window.intercomSettings = {
app_id: "key"
};
</script>
<script>(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/key';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
如果有人遇到此错误并且有任何解决方法的建议或提示,我们将不胜感激。
在 GTM 将代码包装到最小化的 JavaScript 文件中以将其注入页面之前,代码会经过 linter;这里的问题是 Google 有时会更改 linter 的规则以使其更加严格(这在 GTM 论坛上出现过几次)。由于这不会在任何地方公布,它偶尔会破坏以前一直有效的标签。
这里的问题似乎是您在 if/else 块中标记声明了一个函数。当你 "beautify" 你的文件时你可以看到这个:
<script>
window.intercomSettings = {
app_id: "key"
};
</script>
<script>
(function() {
var w = window;
var ic = w.Intercom;
if (typeof ic === "function") {
ic('reattach_activator');
ic('update', intercomSettings);
} else {
var d = document;
var i = function() {
i.c(arguments)
};
i.q = [];
i.c = function(args) {
i.q.push(args)
};
w.Intercom = i;
function l() {
var s = d.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://widget.intercom.io/widget/key';
var x = d.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
}
if (w.attachEvent) {
w.attachEvent('onload', l);
} else {
w.addEventListener('load', l, false);
}
}
})()
</script>
"l" 函数是在 "else" 块内声明的,而 Google 的 linter 不喜欢这样(因为以前版本的 Javascript 在技术上没有函数的块范围,这仅在 ES6 中引入)。
虽然我确信有一个正确的方法来解决这个问题,但一个简单的方法是将 "l" 的声明移到块外:
<script>
(function() {
var w = window;
function l() {
var s = d.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://widget.intercom.io/widget/key';
var x = d.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
}
var ic = w.Intercom;
if (typeof ic === "function") {
ic('reattach_activator');
ic('update', intercomSettings);
} else {
var d = document;
var i = function() {
i.c(arguments)
};
i.q = [];
i.c = function(args) {
i.q.push(args)
};
w.Intercom = i;
if (w.attachEvent) {
w.attachEvent('onload', l);
} else {
w.addEventListener('load', l, false);
}
}
})()
</script>
它看起来不应该有副作用,而且标签现在有效(至少在我尝试时)。
这是根据@ruben-stolk 的建议给出的完整答案。您还需要在新函数的末尾插入一个分号,如下面的代码片段所示。这已在 GTM 中测试并通过了 lint 错误。
<script>
window.intercomSettings = {
app_id: "xe395ivj"
};
</script>
<script>(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/xe395ivj';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);};if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
您可以尝试更改您的代码
function namedFunction(x) {}
至
var namedFunction = function(x){}
我之前使用 Google 标签管理器成功设置了对讲机。几个月没碰它了,去制作一个新标签,但我收到来自内部通信标签的错误:
Error at line 6, character 243: this language feature is only supported for ECMASCRIPT6 mode or better: block-scoped function declaration. Use --language_in=ECMASCRIPT6 or ECMASCRIPT6_STRICT or higher to enable ES6 features.
我的对讲脚本自最初运行以来没有改变:
<script>
window.intercomSettings = {
app_id: "key"
};
</script>
<script>(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;function l(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/key';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);}if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
如果有人遇到此错误并且有任何解决方法的建议或提示,我们将不胜感激。
在 GTM 将代码包装到最小化的 JavaScript 文件中以将其注入页面之前,代码会经过 linter;这里的问题是 Google 有时会更改 linter 的规则以使其更加严格(这在 GTM 论坛上出现过几次)。由于这不会在任何地方公布,它偶尔会破坏以前一直有效的标签。
这里的问题似乎是您在 if/else 块中标记声明了一个函数。当你 "beautify" 你的文件时你可以看到这个:
<script>
window.intercomSettings = {
app_id: "key"
};
</script>
<script>
(function() {
var w = window;
var ic = w.Intercom;
if (typeof ic === "function") {
ic('reattach_activator');
ic('update', intercomSettings);
} else {
var d = document;
var i = function() {
i.c(arguments)
};
i.q = [];
i.c = function(args) {
i.q.push(args)
};
w.Intercom = i;
function l() {
var s = d.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://widget.intercom.io/widget/key';
var x = d.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
}
if (w.attachEvent) {
w.attachEvent('onload', l);
} else {
w.addEventListener('load', l, false);
}
}
})()
</script>
"l" 函数是在 "else" 块内声明的,而 Google 的 linter 不喜欢这样(因为以前版本的 Javascript 在技术上没有函数的块范围,这仅在 ES6 中引入)。
虽然我确信有一个正确的方法来解决这个问题,但一个简单的方法是将 "l" 的声明移到块外:
<script>
(function() {
var w = window;
function l() {
var s = d.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://widget.intercom.io/widget/key';
var x = d.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
}
var ic = w.Intercom;
if (typeof ic === "function") {
ic('reattach_activator');
ic('update', intercomSettings);
} else {
var d = document;
var i = function() {
i.c(arguments)
};
i.q = [];
i.c = function(args) {
i.q.push(args)
};
w.Intercom = i;
if (w.attachEvent) {
w.attachEvent('onload', l);
} else {
w.addEventListener('load', l, false);
}
}
})()
</script>
它看起来不应该有副作用,而且标签现在有效(至少在我尝试时)。
这是根据@ruben-stolk 的建议给出的完整答案。您还需要在新函数的末尾插入一个分号,如下面的代码片段所示。这已在 GTM 中测试并通过了 lint 错误。
<script>
window.intercomSettings = {
app_id: "xe395ivj"
};
</script>
<script>(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',intercomSettings);}else{var d=document;var i=function(){i.c(arguments)};i.q=[];i.c=function(args){i.q.push(args)};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/xe395ivj';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s,x);};if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
您可以尝试更改您的代码
function namedFunction(x) {}
至
var namedFunction = function(x){}