Attiva l'evento change () quando si imposta il valore di <select> con la funzione val ()


132

Qual è il modo più semplice e migliore per attivare l' evento change quando si imposta il valore dell'elemento select .

Mi aspettavo che eseguendo il seguente codice

$('select#some').val(10);

o

$('select#some').attr('value',  10);

porterebbe a innescare l'evento di cambiamento, che penso sia una cosa piuttosto logica da fare. Destra?

Bene, non è così. In questo caso è necessario attivare l'evento change ()

$('select#some').val(10).change();

o

$('select#some').val(10).trigger('change');

ma sto cercando una soluzione che possa innescare un evento di cambiamento non appena il valore di select viene modificato da un codice javascript.


puro javascript element.addEventListener?
Manuel Bitto,

4
$ ( '# selezionare un po') val (10) .Per passare ().; è praticamente istantaneo per l'utente.
Dimitri,

@Manuel l'ho provato. ho usato object.change = function (.... e object.addEventListener (... ma nessuno degli object.value, $ (object) .val () e $ (object) .attr ('value') scatenerebbe quell'ascoltatore
Goran Radulovic il

Risposte:


124

Ho avuto un problema molto simile e non sono del tutto sicuro di ciò che stai riscontrando, poiché il codice suggerito ha funzionato perfettamente per me. E ' immediatamente (un requisito del tuo) fa scattare il seguente codice di cambiamento.

$('#selectField').change(function(){
    if($('#selectField').val() == 'N'){
        $('#secondaryInput').hide();
    } else {
        $('#secondaryInput').show();
}
});

Quindi prendo il valore dal database (questo viene utilizzato su un modulo sia per il nuovo input che per la modifica dei record esistenti), lo imposto come valore selezionato e aggiungo il pezzo che mi mancava per attivare il codice sopra " , .change () ".

$('#selectField').val(valueFromDatabase).change();

In modo che se il valore esistente dal database è 'N', nasconde immediatamente il campo di input secondario nel mio modulo.


Questo è esattamente ciò di cui avevo bisogno. Qual è il modo migliore per scoprire come attivare dinamicamente i gestori di eventi DOM? JQuery lo documenta bene? Grazie!
Con Antonakos,

2
$ ("# discount_type") .val (2) .trigger ('change');
Satanand Tiwari,

$ ( '# add_itp_spt_parent_id') val (add_fpt_val) .trigger ( 'cambiamento').; $ ( '# add_itp_spt_parent_id') cambiamento ().; entrambe le soluzioni non funzionano.
Kamlesh il

funzione di modifica definita PRIMA di utilizzare, risolto il mio problema. Grazie.
Kamlesh,

45

Una cosa che ho scoperto (nel modo più duro) è che dovresti avere

$('#selectField').change(function(){
  // some content ...
});

definito PRIMA di utilizzare

$('#selectField').val(10).trigger('change');

o

 $('#selectField').val(10).change();

4
Vecchio post, ma questo ha risolto il mio problema, mi ha salvato da un lungo e tortuoso crack del cervello ... Devi definire l'ascoltatore prima di usarlo. Anche in puro JavaScript.
Temitayo,

Puoi elaborare un po '? Il "change ()" non è lì per questo motivo?
Dima R.,

Beh, dirò che forse gli ascoltatori di questo tipo non sono stati caricati durante il caricamento. Nel mio progetto, ho chiamato il change()prima di definire l'ascoltatore e non ha funzionato fino a quando non ho spostato la change()chiamata sotto l'ascoltatore e ha funzionato. Bene, dirò che questo non dovrebbe essere un problema, è solo una questione di come strutturi il tuo codice.
Temitayo,

1
Questo è quello di cui avevo bisogno. Mi ha preso per sempre per risolvere questo problema, grazie.
Jamie M.,

Bravo!!! msgstr "la funzione di modifica definita PRIMA di utilizzare", risolto il mio problema. Grazie caro.
Kamlesh il

17

La risposta diretta è già in una domanda duplicata: perché l'evento change jquery non si attiva quando imposto il valore di una selezione usando val ()?

Come probabilmente saprai, l'impostazione del valore di select non attiva l'evento change (), se stai cercando un evento che viene generato quando il valore di un elemento è stato modificato tramite JS non ce n'è uno.

Se vuoi davvero farlo, immagino che l'unico modo sia scrivere una funzione che controlla il DOM su un intervallo e tiene traccia dei valori modificati, ma sicuramente non farlo a meno che non sia necessario (non sono sicuro del motivo per cui avresti mai bisogno)

Aggiunta questa soluzione:
un'altra possibile soluzione sarebbe quella di creare la propria .val()funzione wrapper e fare in modo che attivasse un evento personalizzato dopo aver impostato il valore .val(), quindi quando si utilizza il wrapper .val () per impostare il valore di un <select>, si attiverà l'evento personalizzato che puoi intrappolare e gestire.

Assicurati di farlo return this, quindi è concatenabile in modo jQuery


Ho letto diversi forum su questa domanda e la tua risposta è stata l'ultimo completamento che stavo cercando. L'idea di tracciare funziona solo come un esperimento mentale, ovviamente sarebbe del tutto impraticabile, ma è illustrativa; e l'idea del wrapper è fantastica, e grazie per aver sottolineato la parte "restituisci questo". Saluti.
David L

Perché non $('select').val(value).change()funziona sempre? Qualche spiegazione chiara?
Istiaque Ahmed,

2

Lo separo e quindi uso un confronto di identità per dettare ciò che fa dopo.

$("#selectField").change(function(){
  if(this.value === 'textValue1'){ $(".contentClass1").fadeIn(); }
  if(this.value === 'textValue2'){ $(".contentclass2").fadeIn(); }
});

2

Poiché jQuery non attiverà un evento di modifica nativo ma innescherà solo il proprio evento di modifica. Se si associa un evento senza jQuery e quindi si utilizza jQuery per attivarlo, i callback associati non verranno eseguiti!

La soluzione è quindi come di seguito (funzionante al 100%):

var sortBySelect = document.querySelector("select.your-class"); 
sortBySelect.value = "new value"; 
sortBySelect.dispatchEvent(new Event("change"));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.