2015-06-13 118 views
-1

我有senerio,我需要通過使用動態JavaScript呈現我的HTML頁面。的JavaScript動態加載

我使用loadScript函數加載外部JavaScript和傳遞迴調funtion。在我的HTML頁面中,我正在爲我的標題加載此腳本。 腳本加載後,我的標題部分工作完美,我的頭部部分可以看到我的新腳本。

然而,當我試圖從這個腳本的不確定使用的變量。

function loadScript(url,callback){ 
    var script = document.createElement("script"); 
    script.type = "text/javascript"; 
    script.id="acvDataRequest"; 
    document.getElementsByTagName("head")[0].appendChild(script); 
    if (script.readyState){ //IE 
     script.onreadystatechange = function(){ 
      if (script.readyState == "loaded" || 
        script.readyState == "complete"){ 
       script.onreadystatechange = null; 
       callback(); 
      } 
     }; 
    } else { //Others 
     script.onload = function(){ 
      alert(dataHeader) // I CAN SEE MY OBJECT FROM LOADED SCRIPT 
      callback(); 
     }; 
    } 
    script.src = url; 
    alert(dataHeader);   // IT SAYS UNDEFINED 
} 

調用使用腳本:

var actionName ="JSONdata/json.js"; 
loadScript(actionName,mergeTemplateJSONScript); 

請指點,爲什麼我不能看到我的變量,即使我的腳本是存在的。 裏面script.onload,我能看到我的變量,但不是外界

+1

上可能會問,爲什麼您使用的是手動loadScript功能,當你擁有jQuery和可以只使用'jQuery.getScript()'? – jfriend00

回答

1

你分配什麼:

script.src = url; 

剛剛啓動動態腳本的加載。當你在下一行調用第二行alert()時,你的腳本尚未加載(它正在後臺加載)。您只能可靠地從onload處理程序中的新加載的腳本或從onload處理程序調用的某個函數中訪問變量。

請記住,腳本的動態加載是異步的。這意味着它發生在後臺,而其他腳本仍在運行(因此您的第二個alert()在腳本完成之前運行)。而且,當時的腳本加載完成一段時間後,當它的onload處理程序被調用。

因此,當您動態加載腳本時,所有使用這些腳本的代碼都需要位於onload處理函數中,或者在onload處理程序中調用某個函數,或者保證不會執行,直到某個時間後才執行(例如,在事件中在腳本完成加載之前,您確定不會發生)。

爲了進一步解釋,我已經添加了一些註釋代碼:

function loadScript(url,callback){ 
    var script = document.createElement("script"); 
    script.type = "text/javascript"; 
    script.id="acvDataRequest"; 
    document.getElementsByTagName("head")[0].appendChild(script); 
    if (script.readyState){ //IE 
     script.onreadystatechange = function(){ 
      if (script.readyState == "loaded" || 
        script.readyState == "complete"){ 
       script.onreadystatechange = null; 
       callback(); 
      } 
     }; 
    } else { //Others 
     script.onload = function(){ 
      // ** your script is now loaded here ** 
      alert(dataHeader) // I CAN SEE MY OBJECT FROM LOADED SCRIPT 
      callback(); 
     }; 
    } 
    script.src = url; 
    // ** your script is in the process of loading here and has likely not completed ** 
    alert(dataHeader);   // IT SAYS UNDEFINED 
} 
+0

但我想要的是我需要使用此腳本中的變量。所以你的意思是我應該更喜歡同步加載?但如何做到這一點? – user2985842

+0

@ user2985842 - 你要麼把使用腳本在回調的代碼(也就是回調是什麼),或者你停止使用動態加載和使用同步加載。異步在Javascript中以特定的方式工作,您可以採用這種方式編碼或停止使用異步操作。沒有辦法與異步加載操作同步寫入。 – jfriend00

+0

你是否有任何同步呼叫的例子? – user2985842

1

script.src = url;觸發腳本文件的加載。如果您在外部腳本尚未加載之後立即調用警報。只有調用了onreadystatechangeonload函數後,才能訪問json中的變量。

你應該做的是利用這樣的:

var actionName ="JSONdata/json.js"; 
loadScript(actionName,function(){ 
    alert(dataHeader); 
}); 
+0

如何在這種情況下使用變量。我需要同步呼叫嗎? – user2985842