簡體   English   中英

對講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; 這里的問題是谷歌有時會改變短信的規則,使其更加嚴格(這在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”塊內聲明,而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(){ic(arguments)};iq=[];ic=function(args){iqpush(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){}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM