我正在 Web 环境中编写两个脚本,我无法控制它们的加载顺序。假设这两个脚本称为 MyUtilDoSomething
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/

10-12 15:45