Це може не відповісти безпосередньо на ваше запитання, але цю проблему можна вирішити за допомогою простих коригувань рівня дизайну. Я розумію, що це може бути не на 100% застосовно до всіх випадків використання, але я настійно закликаю вас розглянути можливість перегляду потоку користувачів вашої програми, і якщо наступна пропозиція щодо дизайну може бути реалізована.
Я вирішив зробити що - то просте , ніж злом альтернатив для onChange()
використання інших подій , що не були на самому справі призначені для цієї мети ( blur
, click
і т.д.)
Як я вирішив це:
Просто попередньо відмітьте тег опції заповнювача заповнення, такий як select, який не має для нього ніякого значення.
Тож замість того, щоб просто використовувати таку структуру, яка вимагає альтернатив hack-y:
<select>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Подумайте про використання цього:
<select>
<option selected="selected">Select...</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Таким чином, ваш код набагато спрощений і onChange
буде працювати, як очікувалося, кожен раз, коли користувач вирішить вибрати щось інше, ніж значення за замовчуванням. Ви навіть можете додати disabled
атрибут до першого варіанту, якщо ви не хочете, щоб вони його знову вибрали і змусили вибрати щось із варіантів, тим самим викликаючи onChange()
пожежу.
Під час цієї відповіді я писав складну заявку Vue і виявив, що цей вибір дизайну значно спростив мій код. Я витратив години на цю проблему, перш ніж вирішився з цим рішенням, і мені не довелося переписувати багато свого коду. Однак, якби я пішов із лайливими альтернативами, мені потрібно було б враховувати кращі випадки, щоб запобігти подвійному запуску запитів ajax тощо. Це також не псує поведінку браузера за замовчуванням як хороший бонус (перевірено на мобільному пристрої) браузери).
Іноді просто потрібно зробити крок назад і продумати велику картину для найпростішого рішення.