如何添加新脚本并等待它在javascript中执行

时间:2014-09-11 14:57:05

标签: javascript asynchronous javascript-events

假设我在不同服务器中有my-file.js或某个CDN文件

for (var i = 0; i < 1000; i ++) {
    //something really long and hard to execute
}
//after this long execution

window.myObj = { 
    //initialization of some global object that I need 
}

(我无法更改my-file.js ...)

我想将my-file.js 异步添加到页面,然后在加载后 EXECUTED < / strong>我想打电话给某些事件:

//when my my-file.js is loaded I finally use window.myObj
window.myObj.somefunc(); //yaaay

有可能吗? (IE9 +的跨浏览器对我来说很重要,但任何不重要的)

注意: 如果我需要的文件是CDN或不同服务器上的某个地方 - 我需要记住跨域策略,所以我认为在这种情况下加载ajax中的文件内容是不可能的。

注2: http://www.chromestatus.com/features/5711871906676736我确实需要什么,但我敢打赌,你可以在几年前轻松地在全球范围内使用它。

2 个答案:

答案 0 :(得分:2)

var script = document.createElement('script');
script.onload = function(){
  // loaded
}
document.head.appendChild(script);
script.src = "path/to/script";

关于最简单的例子。是的,整个事情都是异步的,因此它需要onload处理程序。

你也可以将它包装在一个函数中:

function getScript(src,callback){
    var script = document.createElement('script');
    script.onload = callback;
    document.head.appendChild(script);
    script.src = src;
}

getScript('path/to/js',function(){
  //loaded
});

但是,开箱即用,听起来像是需要依赖管理。使用RequireJS。应该符合您的需求。

答案 1 :(得分:0)

jQuery getScript有一个可用于在加载文件后执行事件的回调,或者你可以像Joseph的例子一样使用script.onload:

http://api.jquery.com/jquery.getscript/

如果你想等到某个属性可用(即一些工作完成后),你可以创建一个间隔,然后在窗口中找到属性后立即清除它,即:

var waitForObj = setInterval(function(){
  if(window.myObj && window.myObj.somefunc){
    clearInterval(waitForObj);
    //Do some stuff you need this object for
  }
}, 100);