Es posible que esto no responda directamente a su pregunta, pero este problema podría resolverse mediante simples ajustes de nivel de diseño. Entiendo que esto puede no ser 100% aplicable a todos los casos de uso, pero le recomiendo que considere repensar el flujo de su aplicación por parte del usuario y si se puede implementar la siguiente sugerencia de diseño.
Decidí hacer algo simple que la piratería alternativas para onChange()
el uso de otros eventos que no fueron realmente destinados para este propósito ( blur
, click
, etc.)
La forma en que lo resolví:
Simplemente coloque una etiqueta de opción de marcador de posición como select que no tiene valor
Entonces, en lugar de simplemente usar la siguiente estructura, que requiere alternativas de hack-y:
<select>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Considere usar esto:
<select>
<option selected="selected">Select...</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Entonces, de esta manera, su código es MUCHO más simplificado y onChange
funcionará como se espera, cada vez que el usuario decida seleccionar algo que no sea el valor predeterminado. Incluso podría agregar el disabled
atributo a la primera opción si no desea que lo seleccionen nuevamente y obligarlos a seleccionar algo de las opciones, lo que desencadena un onChange()
incendio.
En el momento de esta respuesta, estoy escribiendo una aplicación Vue compleja y descubrí que esta elección de diseño ha simplificado mucho mi código. Pasé horas en este problema antes de establecerme con esta solución y no tuve que volver a escribir mucho de mi código. Sin embargo, si optara por las alternativas hacky, habría tenido que tener en cuenta los casos límite, para evitar la doble activación de las solicitudes de ajax, etc. Esto tampoco estropea el comportamiento predeterminado del navegador como una buena ventaja (probado en dispositivos móviles navegadores también).
A veces, solo necesita dar un paso atrás y pensar en el panorama general para la solución más simple.