143 votes

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

Quel est le moyen le plus simple et le plus efficace de déclencher changement lors de la définition de la valeur de sélectionnez élément.

J'ai prévu que l'exécution du code suivant

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

o

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

aurait pour effet de déclencher l'événement de changement, ce qui me semble assez logique. N'est-ce pas ?

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

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

o

$('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 la sélection est modifiée par un code javascript.

0 votes

Pur javascript element.addEventListener ?

4 votes

$('select#some').val(10).change() ; est à peu près instantané pour l'utilisateur.

0 votes

@Manuel J'ai essayé. J'ai utilisé object.change = function ( .... et object.addEventListener( ... mais aucune des fonctions object.value, $(object).val() et $(object).attr('value') n'a déclenché cette liste.

133voto

criticman Points 479

J'ai eu un problème très similaire et je ne sais pas vraiment ce qui vous pose problème, car le code que vous avez suggéré a très bien fonctionné pour moi. Il s'agit de immédiatement (une de vos exigences) déclenche 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 à la fois pour les nouvelles entrées et pour la modification des enregistrements existants), je la définis comme la valeur sélectionnée et j'ajoute la pièce qui me manquait pour déclencher le code ci-dessus, ".change()".

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

Ainsi, si la valeur existante dans la base de données est "N", le champ de saisie secondaire est immédiatement masqué dans mon formulaire.

0 votes

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 !

2 votes

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

0 votes

$('#add_itp_spt_parent_id').val(add_fpt_val).trigger('change') ; $('#add_itp_spt_parent_id').change() ; les deux solutions ne fonctionnent pas.

51voto

Dima R. Points 105

Une chose que j'ai découvert (à la dure), c'est que vous devriez avoir

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

défini AVANT que vous n'utilisiez

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

o

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

4 votes

C'est un vieux post mais cela a résolu mon problème, m'a évité un long travail de réflexion... Vous devez définir l'écouteur avant de l'utiliser. Même en JavaScript pur.

0 votes

Pouvez-vous développer un peu ? Le "change()" n'est-il pas là pour cette raison ?

0 votes

Eh bien, je dirai que peut-être que les auditeurs de ce genre ne sont pas hissés sur la charge, Dans mon projet, j'ai appelé les change() avant de définir l'écouteur et cela n'a pas fonctionné jusqu'à ce que je déplace le fichier change() sous l'écouteur et ça a marché. Je dirais que cela ne devrait pas être un problème, c'est juste une question de la façon dont vous structurez votre code.

17voto

Clarence Liu Points 2062

La réponse directe se trouve déjà dans une question dupliquée : Pourquoi l'événement de changement jquery ne se déclenche-t-il pas lorsque je définis la valeur d'une sélection à l'aide de val() ?

Comme vous le savez probablement, la définition de la valeur de la sélection ne déclenche pas l'événement change(). Si vous cherchez un événement qui est déclenché lorsque la valeur d'un élément a été modifiée par JS, il n'y en a pas.

Si vous voulez vraiment faire cela, je pense 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 vois pas pourquoi vous en auriez besoin).

Ajouté cette solution :
Une autre solution possible serait de créer votre propre .val() et faire en sorte qu'elle déclenche un événement personnalisé après avoir défini la valeur à l'aide de la fonction .val() alors, lorsque vous utilisez votre wrapper .val() pour définir la valeur d'un fichier de type <select> cela déclenchera votre événement personnalisé que vous pourrez piéger et gérer.

Veillez à return this Il est donc chaînable à la manière de JQuery.

0 votes

J'ai lu plusieurs forums sur cette question, et votre réponse était le dernier complément que je cherchais. L'idée du suivi ne fonctionne qu'en tant qu'expérience mentale, évidemment ce serait tout à fait impraticable, mais c'est illustratif ; et l'idée du wrapper est géniale, et je vous remercie d'avoir souligné la partie "return this". Salutations.

0 votes

Pourquoi ne pas $('select').val(value).change() travailler tout le temps ? Une explication claire ?

8voto

Mohamed23gharbi Points 1406

Comme jQuery ne déclenche pas l'événement de changement natif mais seulement son propre événement de changement. Si vous liez un événement sans jQuery et que vous utilisez ensuite jQuery pour le déclencher, les callbacks que vous avez liés ne seront pas exécutés !

La solution est alors la suivante (100% fonctionnelle) :

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

2voto

Beaumont Points 31

Je le sépare, et ensuite j'utilise une comparaison d'identité pour dicter ce qu'il fait ensuite.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X