JQuery ".triggerHandler ()" vs. ".trigger ()" lorsque plusieurs éléments sont sélectionnés

Le mécanisme jQuery ".triggerHandler ()", contrairement à ".trigger ()", ne fonctionne que sur le premier élément référencé par l'objet jQuery pour lequel il s'appelle. En d'autres termes,

$('.all-over-the-page').triggerHandler("readjust"); 

N'appellera que le gestionnaire "réajuster" pour le premier élément avec la classe "all-over-the-page", même s'il existe de nombreux éléments sur la page avec cette classe. La méthode ".trigger ()", d'autre part, les affecterait tous.

Je me rends compte que je peux utiliser ".each ()" pour contourner cela (ou simplement écrire mon propre remplaçant qui le fait pour moi), mais y a-t-il une raison pour laquelle les deux sont différents à cet égard? Cela n'a aucun sens pour moi. (Je comprends évidemment qu'il est presque impossible de le changer maintenant.)

Modifier pour clarifier:

Il est probablement plus facile de comprendre pourquoi je me gratte la tête si je fournit un contexte dans le style du code que j'ai effectivement obtenu. Lorsque j'ai mis en place un code pour diverses fonctions "widget" sur une page, cela implique souvent des gestionnaires d'événements. Un bon exemple est une sorte de sorte de certains domaines dont la pertinence est contrôlée par une case à cocher, un bouton radio ou un sélecteur. Une occurrence commune de cela est la case à cocher «Adresse de livraison» qui s'affiche sur un zillion de sites de commerce électronique: si la case à cocher est cochée, l'adresse d'expédition est désactivée et l'adresse de facturation est utilisée.

Considérons maintenant qu'un autre code peut, pour ses propres raisons qui sont totalement indépendantes du widget checkbox-control, réellement faire des choses sur le formulaire qui peut inclure la mise à jour des paramètres de case à cocher par programme. Dans ce cas, cet autre code de widget pourrait vouloir utiliser "triggerHandler ()" pour indiquer des widgets, "hey, j'ai mis à jour certaines choses, alors vous voudrez peut-être ré-vérifier l'état actuel et ajuster si nécessaire".

Ainsi, si ".triggerHandler ()" fonctionnerait sur tous les éléments sélectionnés, je pourrais utiliser:

  $theForm.find('input, select, textarea').triggerHandler('change'); 

Et tous ces gestionnaires pourraient courir et faire tout ce dont ils ont besoin. Comme je l'ai dit, il est assez facile d'écrire:

  $theForm.find('input, select, textarea').each(function() { $(this).triggerHandler('change'); }); 

"… Y a-t-il une raison pour laquelle les deux sont différents à cet égard?"

Je pense que l'idée est que triggerHandler() est censé être une façon d'invoquer la fonction que vous en tant que gestionnaire comme s'il s'agissait d'une autre fonction.

En tant que tel, ils ont créé triggerHandler() afin que la fonction ne soit invoquée qu'une seule fois, elle renvoie la valeur de retour réelle de la fonction, et elle n'affecte pas le DOM avec des comportements bouillonnants ou par défaut.

Bien sûr, la fonction peut se briser si elles ont changé this valeur à autre chose qu'un élément DOM, alors ils utilisent simplement le premier élément adapté.

Si vous désirez simplement utiliser votre fonction, alors je voudrais tout simplement vous en référer et l'invoquer directement, ou comme argument pour .each() .

 $('.element').each( handler_func ); 

… tant que vous n'avez pas besoin de l'objet event .


EDIT: ou si vous voulez que les valeurs renvoyées de l'invocation, utilisez .map() place:

 var return_values = $('.element').map( handler_func ); 

EDIT: en ce qui concerne l'exemple fourni dans la question mise à jour, une bonne solution peut être de profiter de la capacité extraParameters de la méthode trigger() [docs] afin que vous puissiez informer le gestionnaire de preventDefault() et stopPropagation() .

 $('.elememts').bind( 'click', function( e, was_code_triggered ) { if( was_code_triggered ) { e.preventDefault(); e.stopPropagation(); } // your code }); // ... $('.elememts').trigger( 'click', true ); // pass "true" to let handler know // it wasn't a DOM event 

À partir des .trigger() :

"Notez la différence entre les paramètres supplémentaires que nous passons ici et le paramètre eventData à la méthode .bind() . Les deux sont des mécanismes pour transmettre des informations à un gestionnaire d'événements, mais l'argument .trigger() à .trigger() permet de déterminer l'information Au moment où l'événement est déclenché , alors que l'argument eventData à .bind() nécessite que l'information soit déjà calculée au moment où le gestionnaire est lié. "