61 votes

Comment déclencher un événement de changement sur un HTMLSelectElement si la nouvelle valeur est la même que l'ancienne ?

J'ai le balisage suivant :

    1
    2
    3

Lorsqu'un utilisateur ouvre la liste déroulante et sélectionne la même option qui avait été précédemment sélectionnée (ou ne change pas la sélection du tout), JavaScript ne la considère pas comme un événement onchange. Ainsi, la fonction jsFunction() n'est pas appelée. Mais je veux que la fonction jsFunction() soit appelée même dans ce cas. Comment puis-je y parvenir ?

3 votes

Normalement, lorsque je veux ce comportement, j'ajoute une entrée supplémentaire sans valeur qui est la valeur par défaut... et dans le gestionnaire d'événements, je vérifie si elle a été sélectionnée, et si c'est le cas, je ne fais rien.

0 votes

@Geoffrey J'ai aussi pensé à ça. Cela soulève à nouveau un autre problème. Comment puis-je sélectionner dynamiquement l'option désirée (entrée sans valeur dans ce cas) en utilisant JavaScript?

79voto

Simon Aronsson Points 753

Je le ferais comme ça :

  Label
  1
  2
  3

Si vous le souhaitez, vous pouvez avoir le même libellé que le premier choix, qui dans ce cas est 1. Mieux encore : mettez un libellé pour les choix dans la boîte.

1 votes

Et chaque fois que je dois afficher la liste déroulante, je définis selectedIndex sur 0. Fonctionne parfaitement !!

2 votes

Cette solution ne fonctionne pas pour moi si je veux qu'une des options soit sélectionnée par défaut.

24voto

Vous devez ajouter une option vide pour résoudre cela,

Je peux également vous donner une autre solution mais c'est à vous de voir si cela vous convient ou non, car si l'utilisateur sélectionne l'option par défaut après avoir sélectionné d'autres options, la fonction jsFunction sera appelée deux fois.

    1
    2
    3

function jsFunction(){
  var myselect = document.getElementById("selectOpt");
  alert(myselect.options[myselect.selectedIndex].value);
}

3 votes

J'ai déjà essayé ONCLICK auparavant.. ne fonctionne pas dans tous les navigateurs.. notamment Chrome.

3voto

RecoJohnson Points 300

Cela fonctionne:

  Un
  Deux
  Trois
  Quatre
  Cinq
  Six
  Sept
  Huit
  Neuf
  Dix

1voto

eamyx Points 1

Utilisez la propriété "onmouseup" avec chaque élément d'option. C'est verbeux, mais cela devrait fonctionner. De plus, en fonction de ce que fait réellement votre fonction, vous pourriez organiser les choses un peu différemment, en supposant que le numéro soit important dans le gestionnaire :

1  //obtenir l'élément sélectionné dans le gestionnaire
2  //envoyer explicitement la valeur comme argument
3 //comme ci-dessus, mais en utilisant la propriété value de l'élément et en permettant une valeur d'option dynamique. Vous pourriez également envoyer "this.innerHTML" ou "this.textContent" au gestionnaire, rendant la valeur de l'option inutile

0 votes

Je trouve cette solution indésirable car elle ajoute beaucoup de boursouflement à la page. Par exemple, sur une page où il y a 50 lignes d'un tableau, et chacune a un contrôle déroulant en elle et il y a 10 options dans le select, pour votre solution généralisée avec 31 caractères cela implique l'insertion de 15500 caractères. Cela commence déjà à ajouter une quantité substantielle de poids à une page.

1 votes

J'ai également testé ceci et cette solution échoue complètement à fonctionner dans le cas de l'utilisation du clavier pour naviguer ou sélectionner l'élément. Rien n'est déclenché du tout, comme on pourrait s'y attendre.

0voto

Strelok Points 18453

Cela ne se déclenche pas car la valeur n'a pas "changé". C'est la même valeur. Malheureusement, vous ne pouvez pas obtenir le comportement souhaité en utilisant l'événement change.

Vous pouvez gérer l'événement blur et effectuer tout traitement nécessaire lorsque l'utilisateur quitte la zone de sélection. De cette manière, vous pouvez exécuter le code nécessaire même si l'utilisateur sélectionne la même valeur.

0 votes

En réalité, la situation est la suivante. J'ai une boîte de combinaison. Lorsqu'une option est sélectionnée, je cache la boîte de combinaison et affiche la valeur de la boîte de combinaison en tant qu'ÉTIQUETTE avec l'option CHANGER. Lorsque CHANGER est cliqué, je montre à nouveau cette boîte de combinaison.

0 votes

@RajBD, oui, vous ne pourrez pas le faire sans gérer blur et les obliger à quitter la sélection pour la mettre à jour. C'est un petit problème d'utilisabilité cependant. Je pense qu'il serait préférable de leur offrir une option explicite pour "annuler", en plaçant un lien "Annuler" à côté de la boîte de sélection quand vous la montrez.

1 votes

Cela ne fonctionne pas. L'événement de flou ne se déclenche pas tant que l'événement n'a pas perdu le focus. Si vous cliquez simplement sur l'option déjà sélectionnée, il ne se déclenche pas.

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