2012-08-07 19 views
20

Piszę plugin jQuery i korzystania .on i .trigger jak mój pub/podsystemu. Jednak chcę wyzwalać wiele zdarzeń w różnych scenariuszach.jQuery .trigger() wiele zdarzeń

Czy to możliwe, aby zrobić jako jeden ciąg, podobnie jak metody .on?

Cel:

$this.trigger("success next etc"); // doesn't work 

Aktualny rozwiązanie:

$this 
    .trigger("success") 
    .trigger("next") 
    .trigger("etc");     // works, triggers all three events 

Wszelkie sugestie?

Odpowiedz

26

sama JQuery nie obsługuje wyzwalanie wiele zdarzeń, jednak można napisać niestandardowy sposób przedłużenie 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); 

i nazywają to jak następuje:

$this.triggerAll("success next etc"); 
+0

Czy korzystasz z pętli for zamiast z każdej pętli? –

+0

myślę o takim prostym przypadku jest bardziej efektywna w użyciu dla regularnego w pętli zamiast niestandardowego jQuery '$ .each' która robi wiele założeń na argumentach jesteś przejazdem. I wreszcie robi to w środku. – hazzik

+0

To ma sens. Dzięki! –

6

Co masz jest w porządku ... nie może wyzwolić wiele zdarzeń z wykorzystaniem listę oddzielonych przecinkami. Konstruktor trigger() pobiera tylko nazwę zdarzenia i opcjonalne dodatkowe parametry, które przekazują do obsługi zdarzenia.

alterternative byłoby wyzwolić wszystkie zdarzenia dołączone do elementu, to jednak nie może spełniać swoich potrzeb, jeśli trzeba wywołać konkretne zdarzenia w różnych senarios:

$.each($this.data('events'), function(k, v) { 
    $this.trigger(k); 
});​ 
+0

Haha ja po prostu napisał coś podobnego do tego! Cieszę się, że ktoś inny doszedł do tego samego wniosku. Dzięki! –

+0

Możesz dodać '~ [ 'powodzenie', 'obok', 'etc']. IndexOf (K) &&' na początku '$ this.trigger (k)' filtrować pożądanych zdarzeń. –

6

na wszelki wypadek ktoś inny natyka to pytanie w późniejszym życiu, rozwiązałem to, tworząc niestandardową funkcję 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 
+0

Nie propagowałeś params. – mpen

0

Ponieważ nie mam mam przywilej komentowania, dlatego chciałbym zwrócić uwagę, że należy użyć funkcji wewnętrznego użytku. $._data($this[0], 'events')

Powiązane problemy