Il meccanismo jQuery ".triggerHandler()", diversamente da ".trigger()", opera solo sul primo elemento a cui fa riferimento il oggetto jQuery per il quale è stato chiamato. In altre parole,jQuery ".triggerHandler()" vs. ".trigger()" quando sono selezionati più elementi
$('.all-over-the-page').triggerHandler("readjust");
chiamerà solo il gestore di "riaggiustare" per il primo elemento con classe "all-over-the-page", anche se ci sono molti elementi della pagina con quella classe. Il metodo ".trigger()", d'altra parte, avrebbe effetto su tutti loro.
mi rendo conto che posso usare ".each()" per aggirare il problema (o semplicemente scrivere il mio sostituto che lo fa per me), ma c'è un po 'di logica per il motivo per cui i due sono diversi in questo senso? Non ha senso per me. (Capisco, naturalmente, che quasi certamente non può essere cambiato ora.)
modifica per chiarire:
E 'probabilmente più facile da capire perché sto graffiare la mia testa su questo se fornisco un contesto nello stile del codice che ho effettivamente ottenuto. Quando metto insieme il codice per varie funzioni di "widget" su una pagina, che spesso coinvolge gestori di eventi. Un buon esempio è una forma di qualche tipo che ha alcuni campi la cui rilevanza è controllata da una casella di controllo, un pulsante di scelta o un selettore. Un'istanza comune è la casella di controllo "Indirizzo di spedizione" che compare su un sito di e-commerce di zillion: se la casella è selezionata, l'indirizzo di spedizione è disabilitato e viene utilizzato l'indirizzo di fatturazione.
Ora ritengono che qualche altro codice può, per le proprie ragioni che sono totalmente indipendenti dal widget di casella di controllo, in realtà fare le cose per la forma che può includere le impostazioni casella di controllo di aggiornamento a livello di codice. In tal caso, l'altro codice del widget potrebbe voler utilizzare "triggerHandler()" per indicare qualsiasi widget, "hey ho aggiornato alcune cose, quindi potresti voler ricontrollare lo stato corrente e correggerlo se necessario."
Quindi, se ".triggerHandler()" dovrebbe operare su tutti gli elementi selezionati, ho potuto utilizzare:
$theForm.find('input, select, textarea').triggerHandler('change');
e tutti quei gestori potuto correre e fare tutto ciò di cui hanno bisogno. Come ho detto, è abbastanza facile da scrivere: "... c'è una certa logica per il motivo per cui i due sono diversi in questo senso"
$theForm.find('input, select, textarea').each(function() {
$(this).triggerHandler('change');
});
+1 buona domanda A punta –
Non sono sicuro di cosa si stia tentando di fare. Puoi dare un piccolo contesto in più a ciò che stai tentando di risolvere? –
Aggiornato con un po 'più di materiale esplicativo. – Pointy