JQuery.trigger() несколько событий
Я пишу плагин jQuery и использую .on
и .trigger
как свою систему pub/sub. Однако я хочу инициировать несколько событий в разных сценариях.
Можно ли это сделать как одну строку, например метод .on
?
Цель:
$this.trigger("success next etc"); // doesn't work
Текущее решение:
$this
.trigger("success")
.trigger("next")
.trigger("etc"); // works, triggers all three events
Любые предложения?
Ответы
Ответ 1
JQuery сам по себе не поддерживает запуск нескольких событий, однако вы можете написать собственный метод расширения triggerAll
(function($) {
$.fn.extend({
triggerAll: function (events, params) {
var el = this, i, evts = events.split(' ');
for (i = 0; i < evts.length; i += 1) {
el.trigger(evts[i], params);
}
return el;
}
});
})(jQuery);
И назовите его следующим образом:
$this.triggerAll("success next etc");
Ответ 2
У вас все в порядке... вы не можете инициировать несколько событий, используя список, разделенный запятыми. Конструктор trigger() принимает имя события и необязательные дополнительные параметры для передачи обработчику событий.
Альтернативный вариант - инициировать все события, связанные с элементом, однако это может не соответствовать вашим потребностям, если вам нужно инициировать определенные события в разных сенариях:
$.each($this.data('events'), function(k, v) {
$this.trigger(k);
});
Ответ 3
На всякий случай, когда кто-то еще наткнется на этот вопрос позже, я решил это, создав пользовательскую функцию jQuery.
$.fn.triggerMultiple = function(list){
return this.each(function(){
var $this = $(this); // cache target
$.each(list.split(" "), function(k, v){ // split string and loop through params
$this.trigger(v); // trigger each passed param
});
});
};
$this.triggerMultiple("success next etc"); // triggers each event
Ответ 4
Так как у меня нет привилегии комментирования, поэтому я хотел бы указать, что $this.data('events') doesn't work
должна использоваться внутренняя функция использования. $._data($this[0], 'events')