【问题标题】:JS IIFE breaks YouTube TrackingJS IIFE 打破了 YouTube 跟踪
【发布时间】:2018-08-08 12:40:04
【问题描述】:

我很困惑为什么将我的 YouTube 跟踪代码放入 IIFE 会停止工作。

我的理解是 IIFE 可以立即运行,那么为什么包含仅包含裸 js 的脚本与包含 IFEE 的脚本之间存在差异?

这是我的普通 JS,可以正常工作:

if ( 0 < ga_options.youtube.length ) {
    var tag = document.createElement( 'script' );
    tag.src = '//www.youtube.com/iframe_api';
    var firstScriptTag = document.getElementsByTagName( 'script' )[0];
    firstScriptTag.parentNode.insertBefore( tag, firstScriptTag );

    function onYouTubeIframeAPIReady() {
        scroll_events.register_youtube_videos();
    }
}

但是,当我将它包装在 IIFE 中时,如下所示,它不再起作用(不会触发跟踪事件)。我正在尝试使用 IIFE 作为将现有代码重组为独立单元的一部分。

请有人解释我做错了什么?我已经考虑了范围并尝试在 IIFE 之外使用 var tagvar firstScriptTag,但仍然没有成功。

gaEventsVideoTracking = (function(){

    window.console.log( "why no youtube tracking?" );
        if ( 0 < ga_options.youtube.length ) {
            tag = document.createElement( 'script' );
            tag.src = '//www.youtube.com/iframe_api';
            firstScriptTag = document.getElementsByTagName( 'script' )[0];
            firstScriptTag.parentNode.insertBefore( tag, firstScriptTag );

            function onYouTubeIframeAPIReady() {
                scroll_events.register_youtube_videos();
            }
        }
})();

【问题讨论】:

  • 我有一种感觉 onYouTubeIframeAPIReady 想成为你的全球。所以你也许可以这样做 -> window.onYouTubeIframeAPIReady = function () {}
  • 修正了缺少大括号的语法。还是坏了。
  • 你的意思是版本 1,在 IIFE 之外?语法错误是由于粘贴问题造成的。
  • @Keith 效果很好,谢谢。

标签: javascript iife event-tracking


【解决方案1】:

函数 onYouTubeIframeAPIReady 被从 YouTube 服务器加载的脚本调用。

因为您使用函数声明来定义它,所以它是 本地 作用域的 IIFE。这意味着它不是全局的,因此无法供 YouTube 的脚本调用。

您可以明确地将其设为全局。

在第一行(外部 IIFE)添加var onYouTubeIframeAPIReady;,然后将onYouTubeIframeAPIReady =放在函数声明前面,使其成为函数表达式并将其分配给全局变量。

【讨论】:

  • 当然,首先没有任何理由将onYouTubeIframeAPIReady 声明放在IIFE 中。
  • @Bergi — 或者完全使用 IIFE,因为在其中创建的所有其他变量都是隐式全局变量。
猜你喜欢
  • 2021-02-17
  • 2019-12-02
  • 1970-01-01
  • 2018-08-30
  • 2019-05-09
  • 1970-01-01
  • 2018-04-09
  • 2012-01-20
  • 2018-09-01
相关资源
最近更新 更多