To może nie odpowiedzieć bezpośrednio na twoje pytanie, ale ten problem można rozwiązać przez proste dostosowanie poziomu projektu. Rozumiem, że może to nie dotyczyć w 100% wszystkich przypadków użycia, ale zdecydowanie zachęcam do ponownego przemyślenia przepływu aplikacji przez użytkownika i czy można zastosować następującą sugestię projektową.
Zdecydowałem się zrobić coś prostszego niż hackowanie alternatyw dla onChange()
wykorzystania innych zdarzeń, które tak naprawdę nie były przeznaczone do tego celu ( blur
,click
etc.)
Sposób, w jaki to rozwiązałem:
Po prostu wstępnie wstaw symbol zastępczy, taki jak select, który nie ma dla niego żadnej wartości.
Zamiast korzystać z następującej struktury, która wymaga alternatywnych metod hack-y:
<select>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Rozważ użycie tego:
<select>
<option selected="selected">Select...</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
W ten sposób Twój kod jest DUŻO uproszczony i onChange
będzie działał zgodnie z oczekiwaniami, za każdym razem, gdy użytkownik zdecyduje się wybrać coś innego niż wartość domyślna. Możesz nawet dodać disabled
atrybut do pierwszej opcji, jeśli nie chcesz, aby wybrał go ponownie i zmusić do wybrania czegoś z opcji, wywołując w ten sposób onChange()
pożar.
W chwili udzielania odpowiedzi piszę złożoną aplikację Vue i stwierdziłem, że ten wybór projektu znacznie uprościł mój kod. Spędziłem godziny na tym problemie, zanim zdecydowałem się na to rozwiązanie i nie musiałem ponownie pisać dużo mojego kodu. Jednakże, gdybym wybrał hacky alternatywy, musiałbym wziąć pod uwagę przypadki krawędzi, aby zapobiec podwójnemu uruchamianiu żądań ajax itp. To również nie psuje domyślnego zachowania przeglądarki jako miłej premii (testowane na urządzeniach mobilnych przeglądarki również).
Czasami wystarczy zrobić krok do tyłu i pomyśleć o dużym obrazie dla najprostszego rozwiązania.