J'ai un formulaire de saisie qui me permet de choisir parmi plusieurs options et de faire quelque chose lorsque l'utilisateur modifie la sélection. Par exemple,
<select onChange="javascript:doSomething();">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Désormais, doSomething()
ne se déclenche que lorsque la sélection change .
Je veux déclencher doSomething()
lorsque l'utilisateur sélectionne une option, éventuellement la même à nouveau.
J'ai essayé d'utiliser un gestionnaire "onClick", mais cela se déclenche avant que l'utilisateur ne commence le processus de sélection.
Alors, existe-t-il un moyen de déclencher une fonction à chaque sélection par l'utilisateur?
Mettre à jour:
La réponse suggérée par Darryl semblait fonctionner, mais elle ne fonctionne pas de manière cohérente. Parfois, l'événement est déclenché dès que l'utilisateur clique sur le menu déroulant, avant même que l'utilisateur ait terminé le processus de sélection!
la source
Réponses:
Voici le moyen le plus simple:
Fonctionne à la fois avec la sélection de la souris et les touches haut / bas du clavier lorsque la sélection est focalisée.
la source
undefined
toute façon.if(type(this.selectedIndex) != undefined; doSomething()
doSomething()
fonction n'est pas déclenchée lorsque l'utilisateur sélectionne l'option déjà sélectionnée. Voir ce plunk , où la couleur d'arrière-plan ne change que si vous sélectionnez une option différente de celle actuellement sélectionnée.doSomething()
lorsqu'une option spécifique est sélectionnée, par exemple "option 3" dans l'exemple ci-dessus, utilisezif (this.selectedIndex==4)
où le nombre "4" représente l' index numérique des options, PAS celui spécifiévalue
! (c'est-à-dire que "l'option 3" est la quatrième option de<select name="ab">
).J'avais besoin de quelque chose exactement pareil. C'est ce qui a fonctionné pour moi:
Prend en charge ceci:
la source
J'ai eu le même problème lorsque je créais un design il y a quelques mois. La solution que j'ai trouvée était d'utiliser
.live("change", function())
en combinaison avec.blur()
l'élément que vous utilisez.Si vous souhaitez qu'il fasse quelque chose lorsque l'utilisateur clique simplement, au lieu de changer, remplacez simplement
change
parclick
.J'ai attribué un ID à ma liste déroulante et j'ai
selected
utilisé les éléments suivants:J'ai vu que celle-ci n'avait pas de réponse sélectionnée, alors j'ai pensé que je donnerais ma contribution. Cela a très bien fonctionné pour moi, donc j'espère que quelqu'un d'autre pourra utiliser ce code quand il sera bloqué.
http://api.jquery.com/live/
Modifier: utilisez le
on
sélecteur par opposition à.live
. Voir jQuery .on ()la source
Juste une idée, mais est-il possible de mettre un onclick sur chacun des
<option>
éléments?Une autre option pourrait être d'utiliser onblur sur la sélection. Cela se déclenchera chaque fois que l'utilisateur cliquera sur la sélection. À ce stade, vous pouvez déterminer quelle option a été sélectionnée. Pour que cela se déclenche même au bon moment, le clic de l'option pourrait brouiller le champ (rendre autre chose actif ou simplement .blur () dans jQuery).
la source
L'approche onclick n'est pas entièrement mauvaise, mais comme dit, elle ne sera pas déclenchée lorsque la valeur n'est pas modifiée par un clic de souris.
Il est cependant possible de déclencher l'événement onclick dans l'événement onchange.
la source
Je vais développer la réponse de jitbit. Je l'ai trouvé bizarre lorsque vous avez cliqué sur la liste déroulante, puis sur la liste déroulante sans rien sélectionner. A fini avec quelque chose comme:
Cela a un peu plus de sens pour l'utilisateur et permet à JavaScript de s'exécuter à chaque fois qu'il sélectionne une option, y compris une option antérieure.
L'inconvénient de cette approche est qu'elle rompt la possibilité de tabuler sur une liste déroulante et d'utiliser les touches fléchées pour sélectionner la valeur. C'était acceptable pour moi puisque tous les utilisateurs cliquent sur tout tout le temps jusqu'à la fin de l'éternité.
la source
this
place de$(this)
. Cependant, je n'obtiens pas tout le comportement prévu de ceci; il n'alerte pas lorsque je re-sélectionne la même option.onchange
est déclenché lors de l'ajout d'options de suppression à une zone de sélection via JS. Pas seulement lorsqu'un utilisateur sélectionne un élémentSi vous en avez vraiment besoin pour fonctionner comme ça, je le ferais (pour vous assurer que cela fonctionne au clavier et à la souris)
Malheureusement, onclick s'exécutera plusieurs fois (par exemple à l'ouverture de la sélection ... et à la sélection / fermeture) et onkeypress peut se déclencher lorsque rien ne change ...
la source
Pour déclencher correctement un événement chaque fois que l'utilisateur sélectionne quelque chose (même la même option), il vous suffit de tromper la case de sélection.
Comme d'autres l'ont dit, spécifiez un négatif
selectedIndex
sur le focus pour forcer l'événement de changement. Bien que cela vous permette de tromper la boîte de sélection, cela ne fonctionnera pas après cela tant qu'il reste concentré. La solution simple consiste à forcer le flou de la zone de sélection, comme illustré ci-dessous.JS / HTML standard:
Plugin jQuery:
Vous pouvez voir une démo fonctionnelle ici .
la source
En fait, les événements onclick ne se déclenchent PAS lorsque l'utilisateur utilise le clavier pour modifier la sélection dans le contrôle de sélection. Vous devrez peut-être utiliser une combinaison de onChange et onClick pour obtenir le comportement que vous recherchez.
la source
Cela peut ne pas répondre directement à votre question, mais ce problème peut être résolu par de simples ajustements au niveau de la conception. Je comprends que cela peut ne pas être applicable à 100% à tous les cas d'utilisation, mais je vous exhorte fortement à envisager de repenser votre flux d'utilisateurs de votre application et si la suggestion de conception suivante peut être mise en œuvre.
J'ai décidé de faire quelque chose de simple que les alternatives de piratage pour l'
onChange()
utilisation d' autres événements qui ne sont pas vraiment destinés à cet effet (blur
,click
, etc.)La façon dont je l'ai résolu:
Préparez simplement une balise d'option d'espace réservé, telle que select, qui n'a aucune valeur.
Ainsi, au lieu d'utiliser simplement la structure suivante, qui nécessite des alternatives de piratage:
Pensez à utiliser ceci:
Ainsi, de cette façon, votre code est beaucoup plus simplifié et
onChange
fonctionnera comme prévu, chaque fois que l'utilisateur décide de sélectionner autre chose que la valeur par défaut. Vous pouvez même ajouter l'disabled
attribut à la première option si vous ne voulez pas qu'ils le sélectionnent à nouveau et les forcer à sélectionner quelque chose dans les options, déclenchant ainsi unonChange()
incendie.Au moment de cette réponse, j'écris une application Vue complexe et j'ai trouvé que ce choix de conception a beaucoup simplifié mon code. J'ai passé des heures sur ce problème avant de m'installer avec cette solution et je n'ai pas eu à réécrire beaucoup de mon code. Cependant, si je suis allé avec les alternatives hacky, j'aurais dû tenir compte des cas de bord, pour éviter le double tir des demandes ajax, etc. navigateurs également).
Parfois, il vous suffit de prendre du recul et de penser à la situation dans son ensemble pour la solution la plus simple.
la source
Ce que j'ai fait face à un problème similaire, c'est que j'ai ajouté un «onFocus» à la boîte de sélection qui ajoute une nouvelle option générique («sélectionnez une option» ou quelque chose de similaire) et que je la sélectionne par défaut comme option sélectionnée.
la source
Mon objectif était donc de pouvoir sélectionner plusieurs fois la même valeur, ce qui écrase essentiellement la fonction onchange () et la transforme en une méthode onclick () utile.
Sur la base des suggestions ci-dessus, j'ai trouvé cela qui fonctionne pour moi.
http://jsfiddle.net/dR9tH/19/
la source
onfocus="this.selectedIndex=-1"
solutions: la sélection actuelle est annulée si vous accédez au composant par tabulation ou si vous quittez le menu sans rien sélectionner. Appuyez sur tab sur votre violon pour voir ce que je veux dire. (Notez également que vous obtenez une valeur vide et non '-' lorsque vous faites cela. C'est parce queselectedIndex=-1
cela ne vous permet pas<option value="-1">
; ce serait une légère amélioration ici à utiliseronfocus="this.selectedIndex=0"
. C'est une solution de contournement à moitié décente, mais je ne le fais pas comme perdre la sélection actuelle juste parce que j'ai jeté un œil au menu, ou même simplement ytout d'abord, utilisez onChange comme gestionnaire d'événements, puis utilisez la variable indicateur pour lui faire faire la fonction que vous voulez à chaque fois que vous effectuez un changement
la source
Ajoutez une option supplémentaire en premier, comme l'en-tête d'une colonne, qui sera la valeur par défaut du bouton déroulant avant de cliquer dessus et réinitialiser à la fin de
doSomething()
, donc lorsque vous choisissez A / B / C, l'événement onchange se déclenche toujours, lorsque la sélection est terminéeState
, ne faites rien et revenez.onclick
est très instable comme beaucoup de personnes l'ont mentionné auparavant. Donc, tout ce que nous devons faire est de créer une étiquette de bouton initiale qui soit différente de vos véritables options afin que le changement fonctionne sur n'importe quelle option.la source
La chose merveilleuse à propos de la balise select (dans ce scénario) est qu'elle récupérera sa valeur à partir des balises d'option.
Essayer:
A fonctionné convenablement pour moi.
la source
utilisez jquery:
la source
Voici ma solution, complètement différente de toute autre ici. Il utilise la position de la souris pour déterminer si une option a été cliquée au lieu de cliquer sur la case de sélection pour ouvrir la liste déroulante. Il utilise la position event.screenY car c'est la seule variable cross browser fiable. Un événement de survol doit être attaché en premier afin qu'il puisse déterminer la position des contrôles par rapport à l'écran avant l'événement de clic.
Voici mon jsFiddle http://jsfiddle.net/sU7EV/4/
la source
vous devriez essayer d'utiliser
option:selected
la source
Ce qui fonctionne pour moi:
De cette façon, onchange appelle «doSomething ()» lorsque l'option change et onclick appelle «doSomething ()» lorsque l'événement onchange est faux, en d'autres termes, lorsque vous sélectionnez la même option
la source
Essayez ceci (événement déclenché exactement lorsque vous sélectionnez une option, sans changer d'option):
http://jsbin.com/dowoloka/4
la source
Ici, l'index est renvoyé et dans le code js, vous pouvez utiliser ce retour avec un commutateur ou tout ce que vous voulez.
la source
Essaye ça:
la source
Il y a longtemps maintenant, mais en réponse à la question initiale, cela aiderait-il? Mettez juste
onClick
dans laSELECT
ligne. Mettez ensuite ce que vous voulez que chacunOPTION
fasse dans lesOPTION
lignes. c'est à dire:la source
la source
J'avais fait face à un besoin similaire et j'ai fini par écrire une directive angularjs pour le même -
lien guthub - sélection angulaire
Utilisé
element[0].blur();
pour supprimer le focus de la balise de sélection. La logique consiste à déclencher ce flou au deuxième clic de la liste déroulante.as-select
est déclenché même lorsque l'utilisateur sélectionne la même valeur dans la liste déroulante.DEMO - lien
la source
La seule vraie réponse est de ne pas utiliser le champ de sélection (si vous devez faire quelque chose lorsque vous resélectionnez la même réponse.)
Créez un menu déroulant avec div conventionnel, bouton, menu afficher / masquer. Lien: https://www.w3schools.com/howto/howto_js_dropdown.asp
Cela aurait pu être évité si l'on avait pu ajouter des écouteurs d'événements aux options. S'il y avait eu un écouteur onSelect pour l'élément select. Et si le fait de cliquer sur le champ de sélection n'a pas aggravé le déclenchement de mousedown, mouseup et de cliquer en même temps sur mousedown.
la source
Il y a quelques choses que vous voulez faire ici pour vous assurer qu'il se souvient des anciennes valeurs et déclenche un événement onchange même si la même option est à nouveau sélectionnée.
La première chose que vous voulez est un événement onChange régulier:
Pour que l'événement onChange se déclenche même lorsque la même option est à nouveau sélectionnée, vous pouvez annuler l'option sélectionnée lorsque la liste déroulante reçoit le focus en la définissant sur une valeur non valide. Mais vous souhaitez également stocker la valeur précédemment sélectionnée pour la restaurer au cas où l'utilisateur ne sélectionnerait aucune nouvelle option:
Le code ci-dessus vous permettra de déclencher un changement même si la même valeur est sélectionnée. Toutefois, si l'utilisateur clique en dehors de la zone de sélection, vous souhaitez restaurer la valeur précédente. Nous le faisons sur onBlur:
la source
Veuillez noter que les gestionnaires d'événements ne sont pas pris en charge pour la balise OPTION sur IE, avec une réflexion rapide .. J'ai trouvé cette solution, essayez-la et donnez-moi vos commentaires:
Ce que je fais ici est en fait de réinitialiser l'index de sélection afin que l'événement onchange soit toujours déclenché, c'est vrai que vous perdez l'élément sélectionné lorsque vous cliquez et cela peut être ennuyeux si votre liste est longue, mais cela peut vous aider d'une manière ou d'une autre ..
la source
qu'en est-il de la modification de la valeur de la sélection lorsque l'élément gagne le focus, par exemple (avec jquery):
la source
J'ai découvert cette solution.
définissez le selectedIndex de l'élément select sur 0 initialement
appeler cette méthode événement onChange
la source