我对于为什么将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由从YouTube服务器加载的脚本调用。

由于您使用函数声明来定义它,因此它在本地范围内属于IIFE。这意味着它不是全局的,因此无法用于YouTube的脚本调用。

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

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

关于javascript - JS IIFE中断了YouTube跟踪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49032862/

10-12 15:12