script.readyState is undefined in IE11 & FF

script.readyState is undefined in IE11 & FF

本文关键字:amp FF IE11 in readyState is undefined script      更新时间:2023-09-26

我刚刚开发了一个动态脚本加载程序,它在IE9中运行良好,但在IE11和FF中都不正常。

这是我的代码:

function getResourceScript(filename)
{
    var script = document.createElement('script');
    script.setAttribute('src', mShuttlePath + "scripts/" + filename);
    script.setAttribute('type', 'text/javascript');
    script.setAttribute('language', 'javascript');
    document.getElementsByTagName('head')[0].appendChild(script);
}
function documentLoadInit()
{
    if (document.readyState == 'complete')
    {
        // check if all scripts are loaded
        for (var n = 0; n < document.scripts.length; n++)
        {
            if (document.scripts[n].readyState != "complete" && document.scripts[n].readyState != "loaded")
            {
                setTimeout(documentLoadInit, 49);
                return false;
            }
        }
        Init();
    }
    else
    {
        setTimeout(documentLoadInit, 49);
    }
}
getResourceScript("core/core.js");
getResourceScript("core/ajax.js");

这里的主要问题是,script.readyState在IE11中被删除了——我发现了很多!

但是如何替换呢?如何检查脚本何时加载/完成?

有什么想法吗?

来自MSDN:

注意:对于script元素,不再支持readyState。从Internet Explorer 11开始,使用onload。有关信息,请参阅兼容性更改。

所以,不用检查readyState,你可以使用这样的东西:

if (!script.addEventListener) {
    //Old IE
    script.attachEvent("onload", function(){
        // script has loaded in IE 7 and 8 as well.
        callBack();
    });
}
else
{
    script.addEventListener("load", function() {
        // Script has loaded.
        callBack();
    });
}

此外,我非常确信您可以改进您的代码。CCD_ 4更适合这种情况。阅读一些关于如何使用dom事件的内容,如果您仍然存在兼容性问题,这里有一些您可以使用的内容:

function loadExtScript(src, test, callback) {
  var s = document.createElement('script');
  s.src = src;
  document.body.appendChild(s);
  var callbackTimer = setInterval(function() {
    var call = false;
    try {
      call = test.call();
    } catch (e) {}
    if (call) {
      clearInterval(callbackTimer);
      callback.call();
    }
  }, 100);
}

函数将测试作为参数。既然你是应用程序的设计者,你就会知道什么是成功的测试。一旦这个测试为真,它就会执行回调。

实际上,我想您是在问文档在准备好之前是否已经准备好了。您需要设置一个状态更改侦听器,并在每次文档状态更改时进行检查。

document.onreadystatechange = function () {
  if (document.readyState == "complete") {
    initApplication();
  }
}

阅读文档:https://developer.mozilla.org/en-US/docs/Web/API/document.readyState