我正在 Web 环境中编写两个脚本,我无法控制它们的加载顺序。假设这两个脚本称为 MyUtil
和 DoSomething
。MyUtil
包含我将使用 window
绑定(bind)到 window.myUtil = myUtil
对象的实用程序。然后我将在 myUtil
中调用 DoSomething
的方法。
如果首先加载 MyUtil
,一切都会正常进行。如果第二次加载, window.myUtil
将是 undefined
。
如何修改 DoSomething
(和/或 MyUtil)中的代码以等待 window.myUtil
存在,然后 DoSomething
执行其代码?
注意:我使用的是 jQuery 1.2.3。
最佳答案
jQuery.Deferred
对象提供了一种非常优雅的方式来做到这一点(我知道你没有使用 jQuery 1.5:我只是给你一个升级 ;-)
的理由:
假设我们有两个脚本协作如下:
// defines utilities
var util = util || { loaded: $.Deferred() };
(function(){
$.extend(util, {
msg: "Hello!"
});
util.loaded.resolve();
})();
... 和:
// uses them
var util = util || { loaded: $.Deferred() };
util.loaded.then(function(){
alert(util.msg);
});
...在第一个脚本有机会定义它的实用程序后,无论它们加载的顺序如何,警报总是会触发。这比
setTimeout
和基于事件的方法有优势,因为它更容易拥有多个依赖项(使用 $.when
) , 不使用轮询,您不必担心显式处理加载顺序。唯一有点恶心的是所有模块都必须包括:
var util = util || { loaded: $.Deferred() };
... 和
$.extend()
它以确保它们使用相同的延迟。关于javascript - 当另一个函数存在时执行javascript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6209494/