2011-05-05 104 views
3

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

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

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

回答

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 
}) 
+0

的感谢!完美的工作:) – donkapone 2011-05-05 13:11:49

2
var checkvarint = setInterval(function(){ 
    if(swifttagdiv.firstChild.firstChild.src){ 
    varLoaded(); clearInterval(checkvarint); 
    } 
},10); 

function varLoaded(){ 
    alert("LOADED!"); 
    alert(swifttagdiv.firstChild.firstChild.src); 
} 
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);