我对于为什么将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 tag
和var 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/