我很困惑为什么将我的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();
}
}
})();
答案 0 :(得分:1)
从YouTube服务器加载的脚本调用函数onYouTubeIframeAPIReady
。
由于您使用函数声明来定义它,因此本地作用于IIFE。这意味着它不是全球性的,因此无法通过YouTube的脚本进行呼叫。
您可以明确地将其设为全局。
在第一行添加var onYouTubeIframeAPIReady;
(外部 IIFE),然后将onYouTubeIframeAPIReady =
放在函数声明前面,使其成为函数表达式并将其分配给全局变量