2011-07-04 78 views
4

我想使用此代碼加載動態腳本:的JavaScript動態腳本加載IE問題

var headID = document.getElementsByTagName("head")[0]; 
var script = document.createElement('script'); 
script.type='text/javascript'; 
script.src="js/ordini/ImmOrd.js"; 
script.setAttribute("onload", "crtGridRicProd();");      
headID.appendChild(script); 

我需要的頁面開始時推出crtGridRicPrdo()函數,並在FireFox所有工作正常,但在互聯網資源管理器我遇到問題!

+0

至極版本你用? – reporter

+0

你對IE有什麼問題?這是一條錯誤消息嗎?需要更多細節。 –

+0

IE 7並沒有顯示錯誤,但沒有加載功能! – Marco

回答

0

您正在從外部來源加載腳本。所以你需要等到它加載。您可以在ID完成後調用您的功能。

var headID = document.getElementsByTagName("head")[0]; 
var script = document.createElement('script'); script.type='text/javascript'; 
script.onload=scriptLoaded; 
script.src="js/ordini/ImmOrd.js"; script.setAttribute("onload", "crtGridRicProd();"); 
headID.appendChild(script); 

function scriptLoaded(){ 
// do your work here 
} 
+0

無法在ie8 – Dan

0

當我衝你的代碼,我發現你試圖追加一個onload事件到腳本標記。

<html> 
<head> 
    <script type="text/javascript" onLoad="crtGridRicPrdo()"> 
    ... 
    </script> 
</head> 
<body> 
    ... 
</body> 
</html> 

這將是您的JavaScript代碼的結果。你爲什麼不把它添加到身體標籤? 這是一個經典的方式,也將在IE下工作。這也將減少您的代碼:

var bodyID = document.getElementsByTagName("body")[0]; 
bodyID.setAttribute("onload", "crtGridRicProd();"); 
+0

這是很好的解決方案,但我有更多這樣的:bodyID。setAttribute(「onload」,「crtGridRicProd();」);因爲我必須爲每個樹形菜單動態加載不同的腳本單擊 – Marco

+0

您可以添加多個方法調用。你必須做的只是調用不同名稱的方法。 – reporter

+0

是的,我必須從每個點擊 – Marco

8

Internet Explorer不支持「的onload」的腳本標籤,而是提供「的onreadystatechange」(類似於一個XHR對象)。在你的js結束

script.onreadystatechange = function() { 
    if (this.readyState == 'complete' || this.readyState == 'loaded') { 
    crtGridRicProd(); 
    } 
}; 

否則,你可以調用crtGridRicProd()文件

編輯

例如:你可以用這種方法檢查其狀態

測試.js:

function test() { 
    alert("hello world"); 
}; 

的index.html:

<!DOCTYPE html> 
<html> 

    <head> 
    <title>test</title> 
</head> 
<body> 
    <script> 
     var head = document.getElementsByTagName("head")[0] || document.body; 
     var script = document.createElement("script"); 

     script.src = "test.js"; 

     script.onreadystatechange = function() { 
      if (this.readyState == 'complete' || this.readyState == 'loaded') { 
       test(); 
      } 
     }; 

     script.onload = function() { 
      test(); 
     }; 

     head.appendChild(script); 

    </script> 
</body> 

,你會看到在這兩個瀏覽器的警告!

+0

我嘗試這個,但不適用於我,也在Firefox現在不工作,沒有顯示錯誤 – Marco

+0

按照我的完整示例;) – daveoncode

+0

我嘗試但不適合我!如何將IE替換爲:script.setAttribute(「onload」,「crtGridRicProd();」); ??謝謝 – Marco

5

我用下面的加載腳本接二連三(async=false):

var loadScript = function(scriptUrl, afterCallback) { 
      var firstScriptElement = document.getElementsByTagName('script')[0]; 
    var scriptElement = document.createElement('script'); 
      scriptElement.type = 'text/javascript'; 
      scriptElement.async = false; 
      scriptElement.src = scriptUrl; 

    var ieLoadBugFix = function (scriptElement, callback) { 
     if (scriptElement.readyState == 'loaded' || scriptElement.readyState == 'complete') { 
      callback(); 
     } else { 
      setTimeout(function() { ieLoadBugFix(scriptElement, callback); }, 100); 
     } 
    } 

    if (typeof afterCallback === "function") { 
     if (typeof scriptElement.addEventListener !== "undefined") { 
      scriptElement.addEventListener("load", afterCallback, false) 
     } else { 
      scriptElement.onreadystatechange = function(){ 
       scriptElement.onreadystatechange = null; 
       ieLoadBugFix(scriptElement, afterCallback); 
      } 
     } 
    } 
    firstScriptElement.parentNode.insertBefore(scriptElement, firstScriptElement); 
} 

使用方法如下:

loadScript('url/to/the/first/script.js', function() { 
    loadScript('url/to/the/second/script.js', function() { 
    // after both scripts are loaded 
    }); 
}); 

一個bug修正該腳本包括對IE的延遲錯誤。

+1

測試:IE7,IE8,IE9,鉻2S延遲(睡眠) – czerasz

+1

「該腳本包含的一個錯誤修正是IE的延遲錯誤」我找不到任何信息在這個任何地方,你能解釋一下請 – frostymarvelous

+0

如果沒有ieLoadBugFix,我在延遲提供文件時遇到問題。強制您的服務器在返回文件觀察它之前等待2秒。 – czerasz