Подтвердить что ты не робот

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

Любые предложения?

4b9b3361

Ответ 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')