JS IIFE打破了YouTube追踪

时间:2018-02-28 15:16:47

标签: javascript iife event-tracking

我很困惑为什么将我的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();
            }
        }
})();

1 个答案:

答案 0 :(得分:1)

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

由于您使用函数声明来定义它,因此本地作用于IIFE。这意味着它不是全球性的,因此无法通过YouTube的脚本进行呼叫。

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

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