代码之家  ›  专栏  ›  技术社区  ›  chdonncha

内部通信ECMAScript 6标记管理器错误

  •  5
  • chdonncha  · 技术社区  · 6 年前

    我之前使用Google Tag Manager成功设置了对讲机。有几个月没有碰过它了,现在去做一个新的标签,但我发现这个错误来自对讲机标签:

    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>
    

    如果有人遇到这个错误,并对如何解决它有任何建议或提示,我们将不胜感激。

    3 回复  |  直到 6 年前
        1
  •  14
  •   Eike Pierstorff    6 年前

    在GTM将代码包装到最小化的JavaScript文件中以将其注入页面之前,代码要经过一个过梁;这里的问题是,谷歌有时会更改linter的规则,使其更加严格(这在GTM论坛上出现过几次)。由于这并没有在任何地方公布,所以它偶尔会破坏以前工作过的标签。

    这里的问题似乎是在if/else块中标记声明函数。当您“美化”文件时,可以看到:

    <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”块中声明的,而谷歌的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>
    

    看起来不应该有副作用,标签现在可以工作了(至少在我尝试的时候)。

        2
  •  4
  •   Tony Abou-Assaleh    6 年前

    下面是根据@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>
        3
  •  1
  •   rollstuhlfahrer    6 年前

    您可以尝试更改代码

    function namedFunction(x) {}
    

    var namedFunction = function(x){}