您可以讓「customevent1」和「customevent2」的事件處理程序在觸發時發出「延遲」實例。您可以使用「$ .when()」,然後將這兩個合併爲一個,這就是您只需在自定義事件觸發後即可觸發處理程序的地方。
var df1 = $.Deferred(), df2 = $.Deferred();
$('whatever').bind('customevent1', function() {
// code code code
df1.resolve();
}).bind('customevent2', function() {
// code code code
df2.resolve();
});
var whenBoth = $.when(df1, df2);
whenBoth.then(function() {
// code to run after both "customevent1"
// and "customevent2" have fired
});
老的回答,是爲了完整性起見
你可以使自己的遞延對象跟蹤的兩個條件和火災「決心」時都被設置:
function watchEvents() {
var df = $.Deferred();
var flags = {};
$.each(Array.prototype.slice.call(arguments, 0), function() {
flags[this] = false;
});
var realResolve = df.resolve.bind(df);
df.resolve = function(eventName) {
flags[eventName] = true;
for (var ev in flags) if (flags[ev] === false) return;
realResolve();
};
return df;
}
現在您可以調用該功能:
var df = watchEvents("customevent1", "customevent2");
個
而現在這些事件的事件處理程序只需要調用「解決」上的事情時,他們抓住的事件:
df.resolve(event.type);
每個處理程序報告了自己的類型。只有當您調用「watchEvents」時發生的所有事件類型都會發生,您在「df」上註冊的處理函數纔會被調用。
它發生在我身上,你可以做的另一件事是編寫一個jQuery插件,爲元素初始化Deferred對象,並將其存儲在「.data()」屬性中。然後,您可以編寫一些可供事件處理程序用來發信號的插件,以及其他用於註冊多事件序列的處理程序的插件。我認爲這很酷,但我需要花一些時間思考它。
是 「df.reserve」 上面一個錯字?我無法在jQuery Deferred API文檔中找到保留屬性。如果你可以提供一個鏈接,如果它存在,我將不勝感激。 – 2011-02-15 21:13:47
是的當它 - 當我的意思是「解決」時,我繼續打字「保留」! – Pointy 2011-02-15 21:14:54