jQuery choisi ne déclenche pas l’événement onchange lorsque la valeur est modifiée via JS

JSFiddle

J’ai mis en place une select avec 3 option (1 vierge) dans le violon. Lorsque je passe manuellement de foo à bar , l’écouteur de change déclenche normalement.

Maintenant, si je réinitialise la select via JS avec le code affiché dans certaines réponses ici , l’événement de change ne se déclenche pas pour l’option vide nouvellement sélectionnée. En outre, si je sélectionne l’option sélectionnée avant de cliquer sur le bouton de reset l’événement onchange remporté Ne tirez pas non plus.

Je suis sûr que la valeur de la select est modifiée avec la fonction ci-dessus, ce qui peut être vu dans ce violon , mais l’événement onchange la select ne se déclenche tout simplement pas.

J’ai également essayé les événements onchange , onclick , oninput sans succès. À l’heure actuelle, je me demande si je devrais utiliser un MutationObserver ou supprimer l’élément choisi rendu dans le DOM et en créer un autre, mais je le pense probablement trop. Toute aide est appréciée.

Également:

Cette réponse m’a beaucoup aidé: jQuery Chosen reset

Cette réponse n’a pas aidé: comment déclencher un événement onchange dans la boîte de sélection du prototype javascript choisie?

Code pour référence future si jsfiddle.net est démonté:

HTML

 
foo bar

JS

 $(function() { $('#chosen').chosen(); $('#wrapper').on('change', '#chosen', function() { console.log('onchange: ' + this.value); }); $('#reset').click(function() { $("#chosen").val('').sortinggger("liszt:updated"); //doesn't work //$("#chosen").prop('selectedIndex', 0).sortinggger("liszt:updated"); //doesn't work either console.log('reset: ' + $('option:selected').val()); }); }); 

Vous devez déclencher la modification après avoir modifié la valeur avec $(selector).sortinggger("change")

 $('#reset').click(function() { $("#chosen").val('').sortinggger("change"); //doesn't work //$("#chosen").prop('selectedIndex', 0).sortinggger("liszt:updated"); console.log('reset: ' + $('option:selected').val()); }); 

Copier une réponse des commentaires de Fabrício Matté qui a fonctionné pour moi afin que les autres personnes ne voient pas ce message et manquent une solution au début, comme je l’ai fait.

 $('#chosen_chzn').remove(); $('#chosen').val('').change().removeClass('chzn-done').chosen(); 

Voir cela sur son violon

Au départ, j’avais essayé de continuer à utiliser l’ .sortinggger('liszt:updated') au lieu de .change() mais cela ne fonctionnait pas. Vous ne voyez pas le raisonnement derrière .removeClass('chzn-done') non plus, mais c’est également essentiel, sinon votre sélection disparaîtra.