web-dev-qa-db-fra.com

jQuery .trigger () plusieurs événements

J'écris un plugin jQuery et utilise .on et .trigger comme système de publication/sous-activité. Cependant, je souhaite déclencher plusieurs événements dans différents scénarios. 

Est-ce possible de faire une seule chaîne, comme la méthode .on?

Objectif:

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

Solution actuelle:

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

Aucune suggestion?

23
Zach Wolf

JQuery lui-même ne prend pas en charge le déclenchement de plusieurs événements. Toutefois, vous pouvez écrire une méthode d'extension personnalisée 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);

Et appelez-le comme suit:

$this.triggerAll("success next etc");
30
hazzik

Ce que vous avez est bien ... vous ne pouvez pas déclencher plusieurs événements en utilisant une liste séparée par des virgules. Le constructeur trigger () prend uniquement un nom d'événement et des paramètres supplémentaires facultatifs à transmettre au gestionnaire d'événements.

Une alternative serait de déclencher tous les événements liés à un élément. Toutefois, cela peut ne pas répondre à vos besoins si vous devez déclencher des événements spécifiques dans différents scénarios:

$.each($this.data('events'), function(k, v) {
    $this.trigger(k);
});​
6
Derek Hunziker

Au cas où quelqu'un tomberait sur cette question plus tard dans la vie, j'ai résolu ce problème en créant une fonction jQuery personnalisée.

$.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
6
Zach Wolf