簡體   English   中英

Javascript 動態腳本加載 IE 問題

[英]Javascript Dynamic Script Loading IE problems

我正在嘗試使用以下代碼動態加載腳本:

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() function,在 FireFox 中一切正常,但在 Internet Explorer 中我有問題!

Internet Explorer 不支持腳本標簽上的“onload”,而是提供“onreadystatechange”(類似於 xhr 對象)。 你可以這樣檢查它的state:

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

否則您可以在 js 文件末尾調用crtGridRicProd()

編輯

例子:

測試.js:

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

索引.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>

您將在兩個瀏覽器中看到警報!

我使用以下內容一個接一個地加載腳本( 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
    });
});

該腳本包含的一個錯誤修復是 IE 的延遲錯誤。

為了在 IE 中動態加載 js 腳本(或 css 文件),您必須仔細檢查加載文件的路徑! 路徑應從“ / ”或“ ./ ”開始。

請注意,IE 有時會丟失前導斜杠 - 例如此處所述: https://olgastattest.blogspot.com/2017/08/javascript-ie.html

您正在從外部源加載腳本。 所以你需要等到它加載。 id 完成后,您可以致電您的 function。

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
}

當我紅色你的代碼時,我發現你試圖 append 一個 onload 事件到腳本標簽。

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

這將是您的 javascript 代碼的結果。 為什么不將它添加到body標簽? 這是經典的方式,也可以在 IE 下工作。 這也將減少您的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM