「customevent1」と「customevent2」のイベントハンドラーは、それぞれが起動したときに「Deferred」インスタンスにシグナルを送るようにすることができます。次に、「$。when()」を使用して、これら2つを1つに結合できます。ここで、両方のカスタムイベントが発生した後にのみハンドラーを発生させます。
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
});
古い答え、完全を期すためにここに
2つの条件を追跡し、両方が設定されている場合に「解決」を実行する独自のDeferredオブジェクトを作成できます。
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");
そして今、それらのイベントのイベントハンドラーは、イベントをキャッチするときに、そのことについて「resolve」を呼び出す必要があります。
df.resolve(event.type);
各ハンドラーは独自のタイプを報告します。「watchEvents」を呼び出したときに要求されたすべてのイベントタイプが発生した場合にのみ、「df」に登録したハンドラー関数が実際に呼び出されます。
別の方法として、要素のDeferredオブジェクトを初期化して「.data()」プロパティに格納するjQueryプラグインを作成することもできます。次に、イベントハンドラーが自分自身に信号を送るために使用できるプラグインや、マルチイベントシーケンスのハンドラーを登録するための他のプラグインを作成できます。それはかなりクールだと思いますが、私はそれを熟考するのに少し時間を費やす必要があります。