script.readyState未定义在IE11和FF

问题描述:

我刚刚在一个动态脚本加载器在IE9中正常工作,但不是在IE11中,而不是在FF中。script.readyState未定义在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 - 这么多,我发现了!

但是如何取代它呢?如何检查当脚本加载/完成时?

任何想法?

+0

在脚本元素上使用'onload'事件。 – 2014-09-02 07:01:30

+0

最后,你只是想检查是否所有的脚本加载? – 2014-09-02 07:22:17

从MSDN:

注:脚本元素,不再支持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(); 
    }); 
} 

而且,我敢肯定,你可以改善你的代码。而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); 
} 

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

+1

+1 @Kovu不会轮询状态更改,请为此使用事件。 javascript有你覆盖 – bottlenecked 2014-09-02 08:10:20

其实我认为你问的是文档在准备好之前是否准备好。您需要设置状态更改侦听器,并在每次文档状态更改时检查。

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

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