JQuery или простой JS: выполнить функцию после того, как слушатель события вернется - PullRequest
2 голосов
/ 26 января 2012

Допустим, у меня есть событие с именем "bar" для элемента #foo.

Есть ли способ, с помощью которого я могу использовать отложенные объекты jQuery, чтобы заставить функцию выполняться сразу после того, как прослушиватели событий bar выполнили / вернули (вернули), отменяют ли какие-либо слушатели bar событие?

А может, мне даже не нужен jQuery для этого?

РЕДАКТИРОВАТЬ: просто чтобы уточнить, что запуск другого события или функции из обработчика bar - это не то, что я ищу - обработчик bar еще не вернулся, так что это не "после этого bar событие." Этот вопрос может показаться странным и не имеет смысла, потому что я пытаюсь решить очень специфическую проблему / ошибку в IE 8.

Нужно что-то подобное:

$('#foo').afterEvent('bar').then(function() {
    // do something
});

Ответы [ 2 ]

0 голосов
/ 26 января 2012

То, что вы хотите сделать, называется многоадресными делегатами, где вы назначаете несколько независимых обработчиков для одного и того же события. Это может быть написано на JavaScript следующим образом:

    function multicast(){
if (arguments == null || arguments.length == 0) return function(){ };

var fns = [], j = 0;
for (var i = 0; i < arguments.length; i++){
if (typeof(arguments[i]) == "function")
fns[j++] = arguments[i];
}

return function(){
for (var i = 0; i < fns.length; i++)
fns[i]();
};
}

Затем вызывается как: (где foo и bar являются функциями)

window.onload = multicast(window.onload, foo, bar); 

JQuery не требуется, это строго JavaScript. Вы заметите, что каждая из функций будет выполняться последовательно, но независимо от возвращаемого значения (если оно есть) предыдущего вызова функции.

Более полное описание этого вы найдете на Delphic Sage . Я также хотел бы отметить, что автор связанной статьи приписывает учебное пособие Джона Ресига Обучение продвинутому JavaScript

[EDIT] Я думаю, что-то не хватает в вашем вопросе. То, как я это читаю, должно делать то, что вы просите: (используя функцию multicast () выше)

$(#'foo').bind('bar',multicast(firstFunction, secondFunction);

Теперь, когда происходит 'bar', firstFunction будет выполняться сразу же после secondFunction и будет делать это независимо от того, отменяет ли firstFunction событие '

0 голосов
/ 26 января 2012

Просто запустите другой метод внутри события бара

Пример

$('#foo').bind('bar', function () {
    // do bar stuff
    // run another method
    baz();
    // or trigger any other listening events
    $('#bin').trigger('otherEvent');
});
...