2011-05-05 101 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);