Javascript动态脚本加载IE问题

Javascript Dynamic Script Loading IE problems

本文关键字:IE 问题 加载 脚本 动态 Javascript      更新时间:2023-09-26

我正在尝试用以下代码动态加载脚本:

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中一切都很好,但在Internet Explorer中我遇到了问题!

Internet explorer不支持脚本标记上的"onload",而是提供"onreadystatechange"(类似于xhr对象(。您可以通过以下方式检查其状态:

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

否则,您可以在js文件的末尾调用crtGridRicProd((

编辑

示例:

test.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>

您将在两个浏览器中都看到警报!

我使用以下内容一个接一个地加载脚本(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的延迟错误。

您正在从外部源加载脚本。所以你需要等到它加载。您可以在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
}

当我修改代码时,我发现您试图将一个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();");

要在IE中动态加载js脚本(或css文件(,必须仔细检查加载文件的路径!路径应从">/"或">"开始/'。

请注意,IE有时会丢失前导斜杠,例如这里所描述的:https://olgastattest.blogspot.com/2017/08/javascript-ie.html