我正在加载一个我异步创建的脚本以帮助防止减慢网站速度。我无法致电Class.track({“some_param”:“some_data”}),因为它尚未可用。我如何实现异步加载并能够调用该类?异步脚本不可访问
在js中加载的代码如下,它发生在关闭body标签之前,并且Class.track在它下面被调用。
<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>
编辑
接过从丹和注释的答案从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>
,你可以做一个假Class.track它记录来电,直到真正的显示出来,只要确保重挫window.Class之前抢电话......就个人而言,我更喜欢轮询自动执行的功能会返回一个setTimeout(arguments.callee);如果self.Class是falsy ... – dandavis
@dandavis谢谢,我实际上使用你说的话+ TJ的答案是什么。而不是使用setTimeout,我正在使用onload。很酷的东西! –