Ich habe ein Eingabeformular, mit dem ich aus mehreren Optionen auswählen und etwas tun kann, wenn sich der Benutzer ändert die Auswahl . Z.B,
<select onChange="javascript:doSomething();">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Wird jetzt doSomething()
nur bei der Auswahl ausgelöst ändert .
Ich möchte auslösen, doSomething()
wenn der Benutzer eine Option auswählt, möglicherweise die dieselbe .
Ich habe versucht, einen "onClick" -Handler zu verwenden, der jedoch ausgelöst wird, bevor der Benutzer den Auswahlprozess startet.
Gibt es also eine Möglichkeit, bei jeder Auswahl durch den Benutzer eine Funktion auszulösen?
Aktualisieren:
Die von Darryl vorgeschlagene Antwort schien zu funktionieren, funktioniert aber nicht konsequent. Manchmal wird das Ereignis ausgelöst, sobald der Benutzer auf das Dropdown-Menü klickt, noch bevor der Benutzer den Auswahlvorgang abgeschlossen hat!
quelle
Antworten:
Hier ist der einfachste Weg:
Funktioniert sowohl mit der Mausauswahl als auch mit den Auf- / Ab-Tasten der Tastatur, wenn die Auswahl fokussiert ist.
quelle
undefined
sowieso nie sein .if(type(this.selectedIndex) != undefined; doSomething()
doSomething()
Funktion wird nicht ausgelöst, wenn der Benutzer die bereits ausgewählte Option auswählt. Sehen Sie sich dieses Diagramm an , in dem sich die Hintergrundfarbe nur ändert, wenn Sie eine andere Option als die aktuell ausgewählte auswählen .doSomething()
wenn eine bestimmte Option ausgewählt ist, z. B. "Option 3" im obigen Beispiel, verwenden Sie,if (this.selectedIndex==4)
wobei die Zahl "4" den numerischen Index der Optionen darstellt, NICHT den angegebenenvalue
! (dh "Option 3" ist die vierte Option von<select name="ab">
).Ich brauchte genau das Gleiche. Das hat bei mir funktioniert:
Unterstützt dies:
quelle
Ich hatte das gleiche Problem, als ich vor ein paar Monaten ein Design entwarf. Die Lösung, die ich gefunden habe, bestand darin, sie
.live("change", function())
in Kombination mit.blur()
dem von Ihnen verwendeten Element zu verwenden.Wenn Sie möchten, dass es etwas tut, wenn der Benutzer einfach klickt, anstatt es zu ändern, ersetzen Sie es einfach
change
mitclick
.Ich habe meinem Dropdown eine ID zugewiesen,
selected
und Folgendes verwendet:Ich sah, dass dieser keine ausgewählte Antwort hatte, also dachte ich mir, ich würde meinen Input geben. Das hat bei mir hervorragend funktioniert, also kann hoffentlich jemand anderes diesen Code verwenden, wenn er nicht weiterkommt.
http://api.jquery.com/live/
Bearbeiten: Verwenden Sie den
on
Selektor im Gegensatz zu.live
. Siehe jQuery .on ()quelle
Nur eine Idee, aber ist es möglich, jedes
<option>
Element mit einem Klick zu versehen?Eine andere Option könnte darin bestehen, onblur für die Auswahl zu verwenden. Dies wird immer dann ausgelöst, wenn der Benutzer von der Auswahl weg klickt. An diesem Punkt können Sie bestimmen, welche Option ausgewählt wurde. Damit dies sogar zum richtigen Zeitpunkt ausgelöst wird, kann das Klicken durch Klicken auf die Option das Feld verwischen (etwas anderes aktivieren oder nur .blur () in jQuery).
quelle
Der Onclick-Ansatz ist nicht ganz schlecht, wird aber wie gesagt nicht ausgelöst, wenn der Wert nicht per Mausklick geändert wird.
Es ist jedoch möglich, das Ereignis onclick im Ereignis onchange auszulösen.
quelle
Ich werde die Antwort von Jitbit erweitern. Ich fand es seltsam, als Sie auf das Dropdown-Menü klickten und dann auf das Dropdown-Menü klickten, ohne etwas auszuwählen. Endete mit etwas in der Art von:
Dies ist für den Benutzer etwas sinnvoller und ermöglicht die Ausführung von JavaScript jedes Mal, wenn er eine Option einschließlich einer früheren Option auswählt.
Der Nachteil dieses Ansatzes besteht darin, dass die Möglichkeit, auf ein Dropdown-Menü zuzugreifen und den Wert mit den Pfeiltasten auszuwählen, unterbrochen wird. Dies war für mich akzeptabel, da alle Benutzer bis zum Ende der Ewigkeit ständig auf alles klicken.
quelle
this
statt übergeben$(this)
. Ich bekomme jedoch nicht das gesamte beabsichtigte Verhalten daraus; Es wird nicht benachrichtigt, wenn ich dieselbe Option erneut auswähle.onchange
Wird ausgelöst, wenn einem Auswahlfeld über JS Optionen zum Entfernen hinzugefügt werden. Nicht nur, wenn ein Benutzer einen Artikel auswähltWenn Sie dies wirklich brauchen, um so zu funktionieren, würde ich dies tun (um sicherzustellen, dass es mit Tastatur und Maus funktioniert)
Leider wird der Onclick mehrmals ausgeführt (z. B. beim Öffnen der Auswahl ... und beim Auswählen / Schließen) und der Onkeypress wird möglicherweise ausgelöst, wenn sich nichts ändert ...
quelle
Um ein Ereignis jedes Mal richtig auszulösen, wenn der Benutzer etwas auswählt (sogar dieselbe Option), müssen Sie nur das Auswahlfeld austricksen.
Wie andere gesagt haben, geben Sie ein Negativ an
selectedIndex
im Fokus an, um das Änderungsereignis zu erzwingen. Auf diese Weise können Sie das Auswahlfeld zwar austricksen, danach funktioniert es jedoch nicht mehr, solange es noch fokussiert ist. Die einfache Lösung besteht darin, das Auswahlfeld zu zwingen, zu verwischen (siehe unten).Standard JS / HTML:
jQuery Plugin:
Sie können hier eine funktionierende Demo sehen .
quelle
Tatsächlich werden die Onclick-Ereignisse NICHT ausgelöst, wenn der Benutzer die Auswahl im Auswahlsteuerelement über die Tastatur ändert. Möglicherweise müssen Sie eine Kombination aus onChange und onClick verwenden, um das gewünschte Verhalten zu erzielen.
quelle
Dies beantwortet Ihre Frage möglicherweise nicht direkt, aber dieses Problem kann durch einfache Anpassungen der Designebene gelöst werden. Ich verstehe, dass dies möglicherweise nicht zu 100% auf alle Anwendungsfälle anwendbar ist, aber ich empfehle Ihnen dringend, Ihren Benutzerfluss Ihrer Anwendung zu überdenken und zu prüfen, ob der folgende Entwurfsvorschlag implementiert werden kann.
Ich beschloss, etwas Einfaches zu tun, als Alternativen zu hacken, um
onChange()
andere Ereignisse zu verwenden, die nicht wirklich für diesen Zweck gedacht waren (blur
,click
usw.)So habe ich es gelöst:
Stellen Sie einfach ein Platzhalter-Options-Tag wie select vor, das keinen Wert hat.
Anstatt nur die folgende Struktur zu verwenden, die Hack-y-Alternativen erfordert:
Erwägen Sie Folgendes:
Auf diese Weise wird Ihr Code viel einfacher und
onChange
funktioniert wie erwartet, jedes Mal, wenn der Benutzer entscheidet, etwas anderes als den Standardwert auszuwählen. Sie können dasdisabled
Attribut sogar zur ersten Option hinzufügen, wenn Sie nicht möchten, dass sie es erneut auswählen, und sie zwingen, etwas aus den Optionen auszuwählen, wodurch ein ausgelöst wirdonChange()
Feuer .Zum Zeitpunkt dieser Antwort schreibe ich eine komplexe Vue-Anwendung und habe festgestellt, dass diese Designauswahl meinen Code erheblich vereinfacht hat. Ich habe Stunden mit diesem Problem verbracht, bevor ich mich für diese Lösung entschieden habe, und ich musste nicht viel von meinem Code neu schreiben. Wenn ich mich jedoch für die hackigen Alternativen entschieden hätte, hätte ich die Randfälle berücksichtigen müssen, um ein doppeltes Auslösen von Ajax-Anfragen usw. zu verhindern. Dies bringt auch das Standardverhalten des Browsers nicht als netten Bonus durcheinander (auf Mobilgeräten getestet) auch Browser).
Manchmal müssen Sie nur einen Schritt zurücktreten und über das Gesamtbild nachdenken, um die einfachste Lösung zu finden.
quelle
Was ich getan habe, als ich mit einem ähnlichen Problem konfrontiert wurde, ist, dass ich dem Auswahlfeld einen 'onFocus' hinzugefügt habe, der eine neue generische Option anfügt ('eine Option auswählen' oder etwas Ähnliches) und diese standardmäßig als ausgewählte Option verwendet.
quelle
Mein Ziel war es daher, denselben Wert mehrmals auswählen zu können, wodurch die Funktion onchange () im Wesentlichen überschrieben und in eine nützliche Methode onclick () umgewandelt wird.
Aufgrund der obigen Vorschläge habe ich mir das ausgedacht, was für mich funktioniert.
http://jsfiddle.net/dR9tH/19/
quelle
onfocus="this.selectedIndex=-1"
Lösungen: Die aktuelle Auswahl wird aufgehoben, wenn Sie zur Komponente wechseln oder wenn Sie mit der Maus aus dem Menü gehen, ohne etwas auszuwählen. Drücken Sie die Tabulatortaste auf Ihrer Geige, um zu sehen, was ich meine. (Beachten Sie auch, dass Sie einen leeren Wert erhalten und nicht '-', wenn Sie dies tun. Das liegt daranselectedIndex=-1
, dass Sie nicht dazu gelangen<option value="-1">
. Es wäre eine leichte Verbesserung, dies zu verwendenonfocus="this.selectedIndex=0"
. Dies ist eine halbwegs anständige Problemumgehung, aber ich nicht Als würde ich die aktuelle Auswahl verlieren, nur weil ich einen Blick auf das Menü geworfen habe oder nur daraufZuerst verwenden Sie onChange als Ereignishandler und dann die Flag-Variable, damit es bei jeder Änderung die gewünschte Funktion ausführt
quelle
Fügen Sie als erste eine zusätzliche Option hinzu, z. B. die Kopfzeile einer Spalte. Dies ist der Standardwert der Dropdown-Schaltfläche, bevor Sie darauf klicken und am Ende zurücksetzen.
doSomething()
Wenn Sie also A / B / C auswählen, wird das Ereignis onchange immer ausgelöst. Wenn die Auswahl getroffen istState
, tun Sie nichts und kehren Sie zurück.onclick
ist sehr instabil, wie viele Leute zuvor erwähnt haben. Alles, was wir tun müssen, ist, eine anfängliche Schaltflächenbezeichnung zu erstellen, die sich von Ihren tatsächlichen Optionen unterscheidet, damit der Wechsel bei jeder Option funktioniert.quelle
Das Wunderbare an dem Select-Tag (in diesem Szenario) ist, dass es seinen Wert aus den Options-Tags abruft.
Versuchen:
Arbeitete anständig für mich.
quelle
benutze jquery:
quelle
Hier ist meine Lösung, ganz anders als alle anderen hier. Es verwendet die Mausposition, um herauszufinden, ob eine Option angeklickt wurde, anstatt auf das Auswahlfeld zu klicken, um die Dropdown-Liste zu öffnen. Es verwendet die Position event.screenY, da dies die einzige zuverlässige browserübergreifende Variable ist. Zuerst muss ein Hover-Ereignis angehängt werden, damit die Steuerelementposition relativ zum Bildschirm vor dem Klickereignis ermittelt werden kann.
Hier ist meine jsFiddle http://jsfiddle.net/sU7EV/4/
quelle
Sie sollten versuchen, zu verwenden
option:selected
quelle
Was funktioniert bei mir:
Auf diese Weise ruft onchange 'doSomething ()' auf, wenn sich die Option ändert, und onclick ruft 'doSomething ()' auf, wenn onchange event false ist, dh wenn Sie dieselbe Option auswählen
quelle
Versuchen Sie Folgendes (Ereignis wird genau ausgelöst, wenn Sie die Option auswählen, ohne die Option zu ändern):
http://jsbin.com/dowoloka/4
quelle
Hier haben Sie den Index zurückgegeben, und im js-Code können Sie diese Rückgabe mit einem Schalter oder allem verwenden, was Sie wollen.
quelle
Versuche dies:
quelle
Würde dies vor langer Zeit, aber als Antwort auf die ursprüngliche Frage, helfen? Einfach
onClick
in dieSELECT
Reihe stellen. Fügen SieOPTION
dann in dieOPTION
Zeilen ein , was jeder tun soll . dh:quelle
quelle
Ich hatte ein ähnliches Bedürfnis und schrieb schließlich eine eckige Direktive für dasselbe -
guthub link - eckige Auswahl
Wird verwendet
element[0].blur();
, um den Fokus vom Auswahl-Tag zu entfernen. Die Logik besteht darin, diese Unschärfe beim zweiten Klicken auf das Dropdown-Menü auszulösen.as-select
wird auch dann ausgelöst, wenn der Benutzer denselben Wert in der Dropdown-Liste auswählt.DEMO - Link
quelle
Die einzig wahre Antwort besteht darin, das Auswahlfeld nicht zu verwenden (wenn Sie etwas tun müssen, wenn Sie dieselbe Antwort erneut auswählen).
Erstellen Sie ein Dropdown-Menü mit dem herkömmlichen Menü div, button, show / hide. Link: https://www.w3schools.com/howto/howto_js_dropdown.asp
Hätte vermieden werden können, wenn man den Optionen Ereignis-Listener hinzugefügt hätte. Wenn es einen onSelect-Listener für das Auswahlelement gegeben hätte. Und wenn das Klicken auf das Auswahlfeld nicht erschwerend ausgelöst hat, schalten Sie die Maus aus, klicken Sie mit der Maus und klicken Sie alle gleichzeitig auf die Maus.
quelle
Es gibt einige Dinge, die Sie hier tun möchten, um sicherzustellen, dass ältere Werte gespeichert werden und ein Änderungsereignis ausgelöst wird, auch wenn dieselbe Option erneut ausgewählt wird.
Das erste, was Sie möchten, ist ein reguläres onChange-Ereignis:
Damit das Ereignis onChange auch dann ausgelöst wird, wenn dieselbe Option erneut ausgewählt wird, können Sie die ausgewählte Option deaktivieren, wenn die Dropdown-Liste den Fokus erhält, indem Sie sie auf einen ungültigen Wert setzen. Sie möchten jedoch auch den zuvor ausgewählten Wert speichern, um ihn wiederherzustellen, falls der Benutzer keine neue Option auswählt:
Mit dem obigen Code können Sie eine Änderung auslösen, auch wenn derselbe Wert ausgewählt ist. Wenn der Benutzer jedoch außerhalb des Auswahlfelds klickt, möchten Sie den vorherigen Wert wiederherstellen. Wir machen es auf onBlur:
quelle
Bitte beachten Sie, dass Event-Handler für das OPTION-Tag im IE nicht unterstützt werden. Denken Sie schnell darüber nach. Ich habe diese Lösung gefunden, probieren Sie sie aus und geben Sie mir Ihr Feedback:
Was ich hier tatsächlich mache, ist das Zurücksetzen des Auswahlindex, so dass das Ereignis onchange immer ausgelöst wird. Es stimmt, dass Sie das ausgewählte Element verlieren, wenn Sie darauf klicken, und es ist möglicherweise ärgerlich, wenn Ihre Liste lang ist, aber es kann Ihnen irgendwie helfen ..
quelle
Was ist mit dem Ändern des Werts der Auswahl, wenn das Element den Fokus erhält, z. B. (mit jquery):
quelle
Ich habe diese Lösung herausgefunden.
Setzen Sie den selectedIndex des select-Elements zunächst auf 0
Rufen Sie diese Methode onChange-Ereignis auf
quelle