javascript动态创建script标签判断是否加载完毕!

如题:我想网页随时加载一个js文件,这个文件内容不固定。
创建后加载在head里,我写成一个函数,如图:

每次加载我都要删除一次,因为HTML5刷新script标签的src貌似无用?貌似网上搜索一些文档也这样说,不过我也不确定!不过确实刷新src的话,还是找不到加载的js里的函数,不过我通过id删除后重新创建解决了这个问题,这也不是重点吧 - -!
重点是我动态创建后,如何判断他是否加载完毕?否则我调用里面的函数会报错 未定义之类的!
如果单用延时我觉得不太好,因为js文件大小,网络状况都是未知数,延时过了也不一定加载完毕(或早就加载完了还在等不是浪费时间嘛)!总之感觉延时的方式不靠谱,因为不能确定是否加载成功,我调用的话会可能报错!
代码该怎么写呢?只考虑IE浏览器 6-11吧(我目前测试的11,上面的代码没问题)
附:我在上面代码这个script_post函数里调用动态创建加载里的函数就报错未定义,而在这个函数外部的后面调用就可以,那么我觉得肯定是还没加载好这个动态创建的js?

这个可以参考tangram里的callByBrowser方法,这个方法就是动态添加一个script标签,加载完后删除这个标签用的
地址 http://tangram.baidu.com/api#baidu.sio%28%29.callByBrowser%28%29
这是其中一部分代码,你自己修改下就行了
var scr =
document.createElement("SCRIPT"),
scriptLoaded
= 0,
options = opt_options
|| {},
charset =
options['charset'],
callback =
opt_callback || function(){},
timeOut
= options['timeOut'] || 0,
timer;

// IE和opera支持onreadystatechange
// safari、chrome、opera支持onload
scr.onload = scr.onreadystatechange = function () {
// 避免opera下的多次调用
if (scriptLoaded) {
return;
};

var readyState = scr.readyState;
if ('undefined' == typeof readyState
|| readyState == "loaded"
|| readyState == "complete") {
scriptLoaded = 1;
try {
callback();
clearTimeout(timer);
} finally {
scr.onload = scr.onreadystatechange = null;
baidu.sio._removeScriptTag(scr);
}
}
};
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-05-15
var _script = document.createElement('script');
_script.setAttribute('charset', sBianMa);
_script.setAttribute('type', 'text/javascript');
_script.setAttribute('src', sUrl);
document.getElementsByTagName('head')[0].appendChild(_script);
if (/msie/.test(window.navigator.userAgent.toLowerCase())) {
_script.onreadystatechange = function () {
if (this.readyState == 'loaded' || this.readyState == 'complete') {
_script.parentNode.removeChild(_script);
if (fCallback) fCallback();
}
}
} else if (/gecko/.test(window.navigator.userAgent.toLowerCase()) ||
/opera/.test(window.navigator.userAgent.toLowerCase())) {
_script.onload = function () {
_script.parentNode.removeChild(_script);
if (fCallback) fCallback();
}
} else {
_script.parentNode.removeChild(_script);
if (fCallback) fCallback();
}本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网