Вы можете иметь обработчики событий для «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");
И теперь ваши обработчики событий для этих событий просто должны вызвать «resolv» для этой вещи, когда они перехватывают события:
df.resolve(event.type);
Каждый обработчиксообщает свой собственный тип.Только когда все типы событий, запрошенные при вызове «watchEvents», произойдут, вызовут те функции-обработчики, которые вы зарегистрировали в «df».
Мне приходит в голову, что вы могли бы написать еще одну вещь:плагин jQuery, который инициализирует отложенный объект для элементов и сохраняет его в свойстве ".data ()".Затем вы можете написать еще несколько плагинов, которые могут использоваться обработчиками событий, чтобы сигнализировать о себе, и другие плагины, чтобы регистрировать обработчики для последовательностей нескольких событий.Думаю, это было бы круто, но мне нужно потратить некоторое время на обдумывание.