2012-08-07 16 views
20

Estoy escribiendo un plugin jQuery y usando .on y .trigger como mi sistema pub/sub. Sin embargo, quiero activar múltiples eventos en diferentes escenarios.jQuery .trigger() múltiples eventos

¿Es posible hacer esto como una sola cuerda, como el método .on?

Objetivo:

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

solución actual:

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

¿Alguna sugerencia?

Respuesta

26

jQuery en sí no es compatible con múltiples eventos de activación, sin embargo se podría escribir método de extensión personalizada 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); 

y llamarlo como siguiente:

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

¿Hay algún beneficio en usar un bucle for en lugar de un bucle? –

+0

Creo que para un caso tan simple es más efectivo usar un bucle for-in regular en lugar de un jQuery personalizado '$ .each' que hace muchas suposiciones sobre los argumentos que está pasando. Y finalmente lo hace por dentro. – hazzik

+0

Eso tiene sentido. ¡Gracias! –

6

Lo que tiene está bien ... no puede desencadenar múltiples eventos utilizando una lista separada por comas. El constructor trigger() solo toma un nombre de evento y parámetros adicionales opcionales para pasar al manejador de eventos.

Un alterternative sería para activar todos los eventos asociados a un elemento, sin embargo, esto no puede satisfacer sus necesidades si es necesario para activar eventos específicos en diferentes senarios:

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

Jaja ¡Acabo de escribir algo similar a esto! Me alegra ver que alguien más llegó a la misma conclusión. ¡Gracias! –

+0

Puede agregar '~ ['succes', 'next', 'etc'], indexOf (k) &&' al comienzo de '$ this.trigger (k)' para filtrar los eventos deseados. –

6

por si alguien tropieza demás sobre esta pregunta más adelante en la vida, resolví esto creando una función jQuery personalizada.

$.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

No propagaste los params. – mpen

0

Dado que, no lo creo Tengo el privilegio de comentar, por lo que me gustaría señalar que $this.data('events') doesn't work, la función de uso interno tiene que ser utilizado. $._data($this[0], 'events')

Cuestiones relacionadas