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:
<select>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Erwägen Sie Folgendes:
<select>
<option selected="selected">Select...</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
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 das disabled
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.