从动态加载的外部javascript文件中访问变量

时间:2011-05-05 12:08:54

标签: javascript jquery dom

我有一个外部js文件被加载(我无法修改)与document.createElement(),我需要从中访问一个变量。问题是,我不知道什么时候完成加载。我尝试了jQuery的文档就绪功能,但它似乎比javascript文件更早部署。我可以像这样访问变量:

setTimeout("console.log(swifttagdiv.firstChild.firstChild.src)", 5000);

但这只是一个测试,看看变量是否是全局变量。有什么想法吗?

3 个答案:

答案 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 );