Событие привязки в jQuery всегда выполняется в конце - PullRequest
2 голосов
/ 22 апреля 2011

Есть ли способ привязать события к какому-либо объекту и гарантировать, что одно из этих событий будет выполняться всегда последним?

  $('#something').bind('click', function () {
    // do something first
  });
  $('#something').bind('click', function () {
    // do this always last
  });  
  $('#something').bind('click', function () {
    // do this after first one
  });

Спасибо!

Ответы [ 3 ]

1 голос
/ 30 октября 2013

Редактировать: это может быть полезно, но может не работать, как того требует вопрос ОП.Обработчик, который запускается на one, не присоединяется к концу текущей очереди обработчика, он работает только на последующих событиях.

Для будущих читателей вы можете добиться этого, передавая обработчик, используяone().

$('.some-class').on('anevent', function(evt) {
    $(this).one(evt.type, function(evt) {
        //this code will fire after all other handlers for this event, except others that are proxied the same way
        console.log(evtO == evt, 'same event');
        if (evt.isDefaultPrevented())//can check signals to see whether you should still handle this event
            return;
        //do stuff last
    });
})

Позже где-нибудь еще:

$('.some-class').on('anevent', function(evt) {
    //do stuff first
    evt.preventDefault();//can signal to prevent the proxied function. could use evt.stopPropagation() instead
})

Единственное предостережение в том, что если более поздний обработчик использует return false; или stopImmediatePropagation(), функция связана сone() вызовет first в следующий раз, когда произойдет это событие, если только вы явно не отсоедините его.

1 голос
/ 22 апреля 2011

Вы можете связать все обработчики за один раз:

$('#something').click(function () {
    first();
    second();
    third();
});

Это дает дополнительный бонус за то, что он немного более эффективен / легок, чем привязка трех отдельных слушателей.

0 голосов
/ 23 января 2019

Возможно, это не очень хороший подход, но я нашел его довольно полезным. Вы можете использовать setTimeout без каких-либо параметров.

$('#something').bind('click', function () {

  setTimeout(function(){
    // This will always execute at last
    // Write your code here.
  });
});

В основном setTimeout() повторно помещает функцию в конец очереди выполнения.

...