2011-05-16 146 views
0

我認爲下面的問題涉及變量作用域,雖然我可能會誤解。變量作用域問題 - 引用外部JS文件中的變量

我創建了一個javascript書籤,它在網頁中插入一些外部JavaScript文件。對於這個書籤,我需要插入3個外部js文件。要插入這些文件,我使用了大約6種不同的功能,都非常相似。我試圖創建一個新函數來鞏固這些功能,但它一直失敗。我認爲它由於範圍可變的問題而失敗,但我可能弄錯了。

下面是工作中插入一種(3)外部的JS文件的代碼:

jQueryCheck(); 
function jQueryLoader() { 
    var jQ = document.createElement('script'); 
    jQ.type = 'text/javascript'; 
    jQ.onload = jQueryCheck; 
    jQ.src = 'http://example.com/jquery.js';  
    document.body.appendChild(jQ); //the jQuery variable get defined here 

} 

function jQueryCheck() { 
    if (typeof jQuery == 'undefined') { 
     jQueryLoader(); 
    } else { 
     tableSorterLoader(); 
    } 
} 

上面的代碼的工作原理,但我必須以插入3個獨立的外部運行幾乎相同的功能的3倍文件。我試圖鞏固碼成以下(這失敗):

var scripts = []; 
    scripts[0] = 'http://example.com/jquery.js'; 
    scripts[1] = 'http://example.com/plugin2.js'; 
    scripts[2] = 'http://example.com/plugin3.js'; 
jsLoader(scripts, mainFunction); 
function jsLoader(file,nextFunction) {//nextFunction is the function that runs after jsLoader is finished 
    for (var i = 0; i <= scripts.length; i++) { 
     function insertScript() { 
      var js = document.createElement('script'); 
      js.type = 'text/javascript'; 
      js.onload = scriptCheck; 
      js.src = file[i]; 
      document.body.appendChild(js);//the jQuery variable fails to get defined here 
     } 
     function scriptCheck() { 
      var variableTest = (typeof jQuery); 
      if (typeof jQuery == 'undefined') { 
       insertScript(); 
      } 
     } 
     scriptCheck(); 
    } 
    nextFunction(); 
} 

我相信我孤立發生問題:document.body.appendChild(js);後(見註釋)。在第一組函數中,jQuery變量在這行代碼中成功定義(因爲插入了jQuery庫)。但是,在第二個函數中,即使jQuery庫仍然被成功插入到網頁的html中,jQuery變量也沒有被定義。有必要驗證是否已定義jQuery,以便在jQuery處於活動狀態並可用之前,其餘代碼不會執行。

任何人都可以提出這個問題的原因以及解決方案?另外,任何人都可以建議改進我的新功能jsLoader(),使其更加智能/專業?

+0

我建議不要聲明嵌套函數。你可以在jsLoader主體之外聲明它們並使它們使用參數工作。 – 2011-05-16 15:17:52

+0

如果我不得不猜測,那麼到您再次檢查時,jquery腳本並未完全加載(因此未被分析和可用)。幾年前,我寫了一個按需加載器,如果我沒有記錯,這是我遇到的一個問題。 – Fge 2011-05-16 15:20:42

回答

0

它看起來像你需要在插件工作前加載jquery文件,所以我不會嘗試一次加載所有三個(如第二個代碼試圖),但要接近它可能就像初始3函數通話確實(也許)。

正如評論所示,我不會使用循環(除非有很多插件文件),而是使用像jsLoader這樣的非嵌套加載函數。第一次調用將jQuery與nextFunction一起調用第一個插件文件的jsLoader,並使用它的nextFunction調用最後一個文件。然後你知道你的文件什麼時候全部加載。