javascript - script.readyState 在 IE11 和 FF 中未定义

标签 javascript internet-explorer-11

我刚刚开发了一个动态脚本加载器,它在 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:

Note: For the script element, readyState is no longer supported. Starting with Internet Explorer 11, use onload. For info, see Compatibility changes.

因此,除了检查 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();
    });
}

另外,我很确定您可以改进您的代码。而 setInterval() 更适合这种情况。阅读一些有关如何使用 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);
}

该函数将测试作为参数。由于您是应用程序的设计者,您会知道什么是成功的测试。一旦此测试为真,它将执行回调。

关于javascript - script.readyState 在 IE11 和 FF 中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25617535/

相关文章:

javascript - 如何使用字符串调用函数

css - 媒体查询在 IE11 中不起作用(解决问题)

Javascript 行号映射

javascript - 搜索列表中的 JSON 数据

angular - 使用 Angular 项目时,只要打开开发人员工具,Internet Explorer 11 就会崩溃

asp.net - 无法删除 TWebBrowser 的边框和滚动条?

javascript - 在 Chrome/IE11/Firefox 中的隐藏空字段中设置值

reactjs - <main> 标签在 IE11 React 应用程序中无法识别

Javascript 没有将我的计数器变量视为数字

javascript - vue-路由器 : failed to resolve async component render