简体   繁体   English

如何延迟运行某些JS代码,直到下载所有异步JS文件?

[英]How can I delay running some JS code until ALL of my asynchronous JS files downloaded?

UPDATE : 更新

I have the following code: 我有以下代码:

<script type="text/javascript">
function addScript(url) {
    var script = document.createElement('script');
    script.src = url;
    document.getElementsByTagName('head')[0].appendChild(script);
}   
addScript('http://google.com/google-maps.js');
addScript('http://jquery.com/jquery.js');

...

// run code below this point once both google-maps.js & jquery.js has been downloaded and excuted

</script>

How can I prevent code from executing until all required JS have been downloaded and executed? 在下载并执行所有必需的JS之前,如何防止代码执行? In my example above, those required files being google-maps.js and jquery.js. 在上面的示例中,这些必需文件是google-maps.js和jquery.js。

You can use the onload event of the script element for most browsers, and use a callback argument: 您可以将脚本元素的onload事件用于大多数浏览器,并使用回调参数:

Edit: You can't really stop the execution of the code when you load scripts in this way (and making synchronous Ajax requests is a bad idea most of the times). 编辑:以这种方式加载脚本时,您不能真正停止执行代码(并且在大多数情况下发出同步Ajax请求是一个坏主意)。

But you can chain callbacks, so if you have some code that depends on both, Two.js and Three.js , you can chain the loading actions, for example: 但是您可以链接回调,因此,如果您有一些代码依赖Two.jsThree.js ,则可以链接加载操作,例如:

loadScript('http://example.com/Two.js', function () {
  // Two.js is already loaded here, get Three.js...
  loadScript('http://example.com/Three.js', function () {
    // Both, Two.js and Three.js loaded...
    // you can place dependent code here...
  });
});

Implementation: 实现方式:

function loadScript(url, callback) {
  var head = document.getElementsByTagName("head")[0],
      script = document.createElement("script"),
      done = false;

  script.src = url;

  // Attach event handlers for all browsers
  script.onload = script.onreadystatechange = function(){
    if ( !done && (!this.readyState || // IE stuff...
      this.readyState == "loaded" || this.readyState == "complete") ) {
      done = true;
      callback(); // execute callback function

      // Prevent memory leaks in IE
      script.onload = script.onreadystatechange = null;
      head.removeChild( script );
    }
  };
  head.appendChild(script);
}

For IE, the onreadystatechange event has to be bound. 对于IE,必须绑定onreadystatechange事件。

I just read CMS's answer , and decided that from his "most browsers" comment, I might have a crack at getting it work for ones that do not have this functionality natively. 我刚刚阅读了CMS的答案 ,并决定从他的“大多数浏览器”评论中,我可能会想尽办法使它本身不具有此功能的人能够使用。

Basically, it's an interval that polls for a variable. 基本上,这是一个轮询变量的时间间隔。

var poll = window.setInterval(function() {

    if (typeof myVar !== 'undefined') {
        clearInterval(poll);
        doSomething();
    };

}, 100);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM