Déclenche l'événement change () lors de la définition de la valeur de <select> avec la fonction val ()

132

Quelle est la manière la plus simple et la meilleure pour déclencher un événement de modification lors de la définition de la valeur de l' élément select .

Je m'attendais à ce que l'exécution du code suivant

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

ou

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

entraînerait le déclenchement de l'événement de changement, ce qui, à mon avis, est une chose assez logique à faire. Droite?

Eh bien, ce n'est pas le cas. Vous devez déclencher l'événement change () en faisant cela

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

ou

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

mais je cherche une solution qui déclencherait un événement de changement dès que la valeur de select est modifiée par un code javascript.

Goran Radulovic
la source
élément javascript pur.addEventListener?
Manuel Bitto
4
$ ('select # some'). val (10) .change (); est à peu près instantané pour l'utilisateur.
Dimitri
@Manuel j'ai essayé ça. iv'e a utilisé object.change = function (.... et object.addEventListener (... mais aucun des objets object.value, $ (object) .val () et $ (object) .attr ('value') déclencherait cet auditeur
Goran Radulovic

Réponses:

124

J'ai eu un problème très similaire et je ne sais pas trop avec quoi vous avez un problème, car votre code suggéré a très bien fonctionné pour moi. Il déclenche immédiatement (une exigence de la vôtre) le code de modification suivant.

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

Ensuite, je prends la valeur de la base de données (elle est utilisée sur un formulaire pour les nouvelles entrées et l'édition des enregistrements existants), la définit comme valeur sélectionnée, et ajoute la pièce qui me manquait pour déclencher le code ci-dessus, ".change () ".

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

Ainsi, si la valeur existante de la base de données est «N», elle masque immédiatement le champ de saisie secondaire dans mon formulaire.

critique
la source
C'est exactement ce dont j'avais besoin. Quelle est la meilleure façon de découvrir comment déclencher dynamiquement des gestionnaires d'événements DOM? Est-ce que jQuery documente bien cela? Je vous remercie!
Con Antonakos
2
$ ("# discount_type") .val (2) .trigger ('change');
Satanand Tiwari
$ ('# add_itp_spt_parent_id'). val (add_fpt_val) .trigger ('change'); $ ('# add_itp_spt_parent_id'). change (); les deux solutions ne fonctionnent pas.
Kamlesh
fonction de changement définie AVANT d'utiliser, a résolu mon problème. Merci.
Kamlesh du
45

Une chose que j'ai découverte (à la dure), c'est que tu devrais avoir

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

défini AVANT d'utiliser

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

ou

 $('#selectField').val(10).change();
Dima R.
la source
4
Ancien post mais cela a résolu mon problème, m'a sauvé d'un long craquement de cerveau ... Vous devez définir l'auditeur avant de l'utiliser. Même en JavaScript pur.
Temitayo
Pouvez-vous élaborer un peu? Le "change ()" n'est-il pas là pour cette raison?
Dima R.
Eh bien, je dirai que les auditeurs de ce type ne sont peut-être pas hissés en charge.Dans mon projet, j'ai appelé le change()avant de définir l'auditeur et cela n'a pas fonctionné jusqu'à ce que j'ai déplacé l' change()appel sous l'auditeur et que cela a fonctionné. Eh bien, je dirai que cela ne devrait pas être un problème, c'est juste une question de la façon dont vous structurez votre code.
Temitayo
1
C'est ce dont j'avais besoin. Cela m'a pris une éternité pour résoudre ce problème, merci.
Jamie M.
Bravo!!! "fonction de changement définie AVANT que vous utilisiez", a résolu mon problème. Merci mon cher.
Kamlesh
17

La réponse directe est déjà dans une question en double: pourquoi l'événement jquery change ne se déclenche-t-il pas lorsque je définis la valeur d'un select à l'aide de val ()?

Comme vous le savez probablement, définir la valeur de select ne déclenche pas l'événement change (), si vous recherchez un événement qui est déclenché lorsque la valeur d'un élément a été modifiée via JS, il n'y en a pas.

Si vous voulez vraiment faire cela, je suppose que le seul moyen est d'écrire une fonction qui vérifie le DOM sur un intervalle et suit les valeurs modifiées, mais ne le faites certainement pas à moins que vous ne le deviez (je ne sais pas pourquoi vous en auriez besoin)

Ajout de cette solution: une
autre solution possible serait de créer votre propre .val()fonction wrapper et de la faire déclencher un événement personnalisé après avoir défini la valeur via .val(), puis lorsque vous utilisez votre wrapper .val () pour définir la valeur de a, <select>cela déclenchera votre événement personnalisé que vous pouvez piéger et manipuler.

Soyez sûr return this, donc il est chaînable à la mode jQuery

Clarence Liu
la source
J'ai lu plusieurs forums sur cette question et votre réponse était la dernière réalisation que je recherchais. L'idée de traquer ne fonctionne que comme une expérience mentale, évidemment ce serait totalement irréalisable, mais c'est illustratif; et l'idée du wrapper est géniale, et merci de nous avoir signalé la partie "renvoyer ce". Cordialement.
David L
Pourquoi ne $('select').val(value).change()fonctionnera pas tout le temps? Une explication claire?
Istiaque Ahmed
2

Je le sépare, puis j'utilise une comparaison d'identité pour dicter ce que fait ensuite.

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

Comme jQuery ne déclenchera pas d'événement de changement natif, mais ne déclenchera que son propre événement de changement. Si vous liez un événement sans jQuery, puis utilisez jQuery pour le déclencher, les rappels que vous avez liés ne s'exécuteront pas!

La solution est alors comme ci-dessous (100% de travail):

var sortBySelect = document.querySelector("select.your-class"); 
sortBySelect.value = "new value"; 
sortBySelect.dispatchEvent(new Event("change"));
Mohamed23gharbi
la source