2013-12-10 51 views
1

我正在读的书:第三方的Javascript加载异步JS文件&readyState?

有一个示例代码:(加载外部JS)

(function() 
    { 
     var script = document.createElement('script'); 
     script.async = true; 
     script.src = 'js_file.js'; 
     script.onload = script.onreadystatechange = function() 
     { 
      var rdyState = script.readyState; 
      if (!rdyState || /loaded|complete/.test(rdyState)) 
      { 
       /*...*/ 
       script.onload = null; 
       script.onreadystatechange = null; 
      } 
     }; 
     var entry = document.getElementsByTagName('script')[0]; 
     entry.parentNode.insertBefore(script, entry); 
    })(); 

我想了解该行:

if (!rdyState || /loaded|complete/.test(rdyState))...

我得到undefined in script.readyState

enter image description here

问题

  • 为什么会出现在script.readyStateundefined
  • 应该readystate返回数字或字符串?根据正则表达式测试,它假设返回字符串。但我见过很多地方返回数字。所以......?

http://jsbin.com/ipOrIDeY/4/edit

(铬31,感谢谷歌,但没有感谢的字体平滑的版本。(32))

+0

似乎同样的问题[这里](http://stackoverflow.com/questions/1929742/can-script-readystate-be-trusted-to-detect-the-end-of-dynamic-script- loading) – guy777

+0

@ guy777有关onreadystate的答案永远不会被调用。但onload确实..... **,这让我问**:readyState只有在调用onreadstate时才设置? –

回答

1

这里是我的代码加载JavaScript文件,它的工作原理很好吧,readystate返回字符串,但它的值取决于你的JavaScript引擎。

var n = document.createElement('script'); 
      n.setAttribute('type', 'text/javascript'); 
      n.setAttribute('src', 'Your src'); 
      n.setAttribute('async', true); 
      n.onerror = function() { 
      callback() 
      n.onerror = null; 
      }; 

      n.onload = n.onreadystatechange = function() { 
      if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') { 
       callback() 
       n.onload = n.onreadystatechange = null; 
      } 
      }; 

      document.body.appendChild(n); 
+0

http://i.stack.imgur.com/ruRDG.png –

+0

我认为readyState不适用于Chrome或Firefox。 [这是一个解决方案](http://web.onassar.com/blog/2011/04/07/readystate-firing-for-dynamically-loaded-scripts/) – guy777