Isso pode não responder diretamente à sua pergunta, mas esse problema pode ser resolvido com simples ajustes no nível do design. Entendo que isso pode não ser 100% aplicável a todos os casos de uso, mas recomendo que você pense em repensar o fluxo de usuários do seu aplicativo e se a sugestão de design a seguir pode ser implementada.
Decidi fazer algo simples do que invadir alternativas para onChange()
usar outros eventos que não foram realmente feitos para esse fim ( blur
,click
, etc.)
A maneira que eu resolvi isso:
Simplesmente anteceda uma tag de opção de espaço reservado, como a seleção que não tem valor para ela.
Portanto, em vez de usar apenas a seguinte estrutura, que requer alternativas de hackers:
<select>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Considere usar isto:
<select>
<option selected="selected">Select...</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Dessa forma, seu código é MUITO mais simplificado e onChange
funcionará conforme o esperado, toda vez que o usuário decidir selecionar algo diferente do valor padrão. Você pode até adicionar o disabled
atributo à primeira opção se não desejar que ele seja selecionado novamente e forçá-lo a selecionar algo entre as opções, acionando assim umonChange()
incêndio.
No momento desta resposta, estou escrevendo um aplicativo Vue complexo e descobri que essa opção de design simplificou bastante meu código. Passei horas com esse problema antes de me estabelecer com esta solução e não precisei reescrever muito do meu código. No entanto, se eu seguisse as alternativas hacky, teria que dar conta dos casos extremos, para impedir o disparo duplo de solicitações de ajax, etc. Isso também não atrapalha o comportamento padrão do navegador como um bom bônus (testado em dispositivos móveis navegadores também).
Às vezes, você só precisa dar um passo atrás e pensar no cenário geral para a solução mais simples.