我有一个外部js文件被加载(我无法修改)与document.createElement(),我需要从中访问一个变量。问题是,我不知道什么时候完成加载。我尝试了jQuery的文档就绪功能,但它似乎比javascript文件更早部署。我可以像这样访问变量:
setTimeout("console.log(swifttagdiv.firstChild.firstChild.src)", 5000);
但这只是一个测试,看看变量是否是全局变量。有什么想法吗?
答案 0 :(得分:4)
您可以使用Javascript注入脚本,而不是将其放在页面中。通过这种方式,您可以控制何时加载它。
这是我用来动态地在页面中注入代码的函数:
function inject(src, cb, target){
target = target || document.body;
var s = document.createElement('SCRIPT');
s.charset = 'UTF-8';
if(typeof cb === 'function'){
s.onload = function(){
cb(s);
};
s.onreadystatechange = function () {
(/loaded|complete/).test(s.readyState) && cb(s);
};
}
s.src = src;
target.appendChild(s);
return s;
}
使用它:
inject('/path/to/file.js', function(script){
//your code here
})
答案 1 :(得分:2)
var checkvarint = setInterval(function(){
if(swifttagdiv.firstChild.firstChild.src){
varLoaded(); clearInterval(checkvarint);
}
},10);
function varLoaded(){
alert("LOADED!");
alert(swifttagdiv.firstChild.firstChild.src);
}
答案 2 :(得分:0)
Mic's answer很棒。
这是同样的事情,只是抽象较少,也许它会有所启发
var scriptElement = document.createElement( 'script' );
scriptElement.type = "text/javascript";
scriptElement.src = "https://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core-debug.js";
function loadHandler() {
alert( 'loaded' );
}
// for ie
scriptElement.onreadystatechange = function () {
if( this.readyState == 'complete' ){
loadHandler();
}
}
// for others
scriptElement.onload= loadHandler;
document.getElementsByTagName('head')[0].appendChild( scriptElement );