Javascript 异步脚本不可访问
我正在加载一个异步创建的脚本,以帮助防止网站速度减慢。我无法调用class.track({“some_param”:“some_data”}),因为它还不可用。如何实现异步加载并能够调用类 下面是加载js的代码,它发生在结束body标记之前,并且在它下面调用Class.trackJavascript 异步脚本不可访问,javascript,asynchronous,Javascript,Asynchronous,我正在加载一个异步创建的脚本,以帮助防止网站速度减慢。我无法调用class.track({“some_param”:“some_data”}),因为它还不可用。如何实现异步加载并能够调用类 下面是加载js的代码,它发生在结束body标记之前,并且在它下面调用Class.track <script type="text/javascript"> (function() { function async_load(){ var api_i
<script type="text/javascript">
(function() {
function async_load(){
var api_id = "XXXXXXXXX";
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://site.com/script.js?id=' + api_id;
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
}
if (window.attachEvent)
window.attachEvent('onload', async_load);
else
window.addEventListener('load', async_load, false);
})();
Class.track("page_view", {"page":"plans"});
</script>
(功能(){
函数异步加载(){
var api_id=“XXXXXXXXX”;
var s=document.createElement('script');
s、 类型='text/javascript';
s、 异步=真;
s、 src='1〕https://site.com/script.js?id=“+api_id;
var x=document.getElementsByTagName('script')[0];
x、 parentNode.insertBefore(s,x);
}
如果(窗口附件)
attachEvent('onload',async\u load);
其他的
addEventListener('load',async\u load,false);
})();
track(“page_view”,{“page”:“plans”});
编辑
采纳了Dan的评论和TJ的答案,并决定对其进行修改,下面是我的想法,希望这能帮助其他人
<script type="text/javascript">
var _Class = new function(){
var items = [];
this.track = function(type, params){
params = params || {};
items.push({"type":type, "params":params});
}
this.get = function(){
return items;
}
};
var Class = _Class;
(function() {
function async_load(){
var api_id = "XXXXXXXXX";
var s = document.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://site.com/script.js?id=' + api_id;
s.onload = function(){
var items = _Class.get();
Class.trackBatch(items);
};
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
}
if (window.attachEvent)
window.attachEvent('onload', async_load);
else
window.addEventListener('load', async_load, false);
})();
Class.track("page_view", {"page":"plans"});
</script>
var_Class=新函数(){
var项目=[];
this.track=函数(类型、参数){
params=params |{};
push({“type”:type,“params”:params});
}
this.get=函数(){
退货项目;
}
};
var类=_类;
(功能(){
函数异步加载(){
var api_id=“XXXXXXXXX”;
var s=document.createElement('script');
s、 类型='text/javascript';
s、 异步=真;
s、 src='1〕https://site.com/script.js?id=“+api_id;
s、 onload=函数(){
var items=_Class.get();
类别.轨道批次(项目);
};
var x=document.getElementsByTagName('script')[0];
x、 parentNode.insertBefore(s,x);
}
如果(窗口附件)
attachEvent('onload',async\u load);
其他的
addEventListener('load',async\u load,false);
})();
track(“page_view”,{“page”:“plans”});
在当前所有主要浏览器中,可以使用脚本
元素的onload
:
s.onload = function() {
/* ...this is called when the script is loaded, so `Class` should
be available...
*/
Class.track("page_view", {"page":"plans"});
};
在旧版本的IE中,您必须改用onreadystatechange
,并检查元素的readyState
属性是否为字符串“complete”
当然,您也可以使用
setTimeout
或setInterval
轮询您创建的全局符号(Class
,在您的情况下,我怀疑),例如如果(typeof Class==“undefined”){/*…在几毫秒内安排另一个检查…*/}
。谢谢您的帮助,如果我加载脚本并尝试在整个页面的任何位置调用Class.track(),这是否是最好的方法?@BrianPutt:我不太清楚你的意思。使用onload
(onreadystatechange
在旧版IE上)是了解脚本何时加载的最佳方法。轮询也是一种选择,但往往需要更多的延迟时间。为了复制google analytics的工作方式,您可以加载GA代码,然后可以在整个页面的任何位置使用GA.track(),希望这是有意义的,因为我对JS World还相当陌生,如果您异步加载代码,你不能指望它被加载到任何地方,除了加载回调或从中调用的东西。好的,我想我会结合你的答案和Dandavis的评论。将创建一个小版本的类来跟踪数据,并在数据被替换之前对其进行处理。我感谢你的帮助!你可以制作一个假的Class.track来记录传入的呼叫,直到真正的呼叫出现,只需确保在关闭窗口之前抓取呼叫。Class。。。就个人而言,我更喜欢在自动执行函数中进行轮询,该函数将返回setTimeout(arguments.callee);如果self.Class是falsy…@dandavis谢谢,我实际上是在用你说的+TJ的答案。我使用的不是setTimeout,而是onload。很酷的东西!