Eu tenho um formulário de entrada que permite selecionar entre várias opções e fazer alguma coisa quando o usuário altera a seleção. Por exemplo,
<select onChange="javascript:doSomething();">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Agora, doSomething()
só é acionado quando a seleção muda .
Quero acionar doSomething()
quando o usuário selecionar qualquer opção, possivelmente a mesma novamente.
Eu tentei usar um manipulador "onClick", mas isso é acionado antes que o usuário inicie o processo de seleção.
Então, existe uma maneira de disparar uma função em cada seleção do usuário?
Atualizar:
A resposta sugerida por Darryl parecia funcionar, mas não funciona de forma consistente. Às vezes, o evento é acionado assim que o usuário clica no menu suspenso, mesmo antes de o usuário concluir o processo de seleção!
javascript
html
html-select
dom-events
ePharaoh
fonte
fonte
Respostas:
Aqui está a maneira mais simples:
Funciona tanto com a seleção do mouse quanto com as teclas Para cima / Para baixo do teclado, quando a seleção é focada.
fonte
undefined
assim.if(type(this.selectedIndex) != undefined; doSomething()
doSomething()
função não é acionada quando o usuário seleciona a opção já selecionada. Veja este plunk , onde a cor do plano de fundo muda apenas se você selecionar uma opção diferente da selecionada no momento.doSomething()
quando uma opção específica é selecionada, por exemplo "opção 3" no exemplo acima, useif (this.selectedIndex==4)
pelo qual o número "4" represente o índice numérico de opções, NÃO o especificadovalue
! (ou seja, "opção 3" é a quarta opção de<select name="ab">
).Eu precisava de algo exatamente igual. Isto é o que funcionou para mim:
Suporta isso:
fonte
Eu tive o mesmo problema ao criar um design há alguns meses. A solução que encontrei foi usar
.live("change", function())
em combinação com.blur()
o elemento que você está usando.Se você quiser fazer algo quando o usuário simplesmente clicar, em vez de mudar, basta substituir
change
porclick
.Atribuí um ID ao meu menu suspenso,
selected
e usei o seguinte:Vi que este não tinha uma resposta selecionada, então achei que daria minha opinião. Isso funcionou muito bem para mim, por isso espero que outra pessoa possa usar esse código quando ficar presa.
http://api.jquery.com/live/
Editar: use o
on
seletor ao contrário de.live
. Veja jQuery .on ()fonte
Apenas uma idéia, mas é possível colocar um clique em cada um dos
<option>
elementos?Outra opção poderia ser usar onblur no select. Isso será acionado sempre que o usuário clicar longe da seleção. Nesse ponto, você pode determinar qual opção foi selecionada. Para que isso seja acionado no momento correto, o clique das opções poderá desfocar o campo (tornar outra coisa ativa ou apenas .blur () no jQuery).
fonte
A abordagem onclick não é totalmente ruim, mas, como dito, não será acionada quando o valor não for alterado com um clique do mouse.
No entanto, é possível disparar o evento onclick no evento onchange.
fonte
Vai expandir a resposta de jitbit. Achei estranho quando você clicou no menu suspenso e depois no menu suspenso sem selecionar nada. Terminou com algo como:
Isso faz um pouco mais de sentido para o usuário e permite que o JavaScript seja executado toda vez que ele seleciona qualquer opção, incluindo uma opção anterior.
A desvantagem dessa abordagem é que ela quebra a capacidade de tabular em uma lista suspensa e use as teclas de seta para selecionar o valor. Isso foi aceitável para mim, pois todos os usuários clicam em tudo o tempo todo até o fim da eternidade.
fonte
this
vez de$(this)
. No entanto, não consigo tirar todo o comportamento pretendido disso; ele não alerta quando seleciono novamente a mesma opção.onchange
é acionado ao adicionar opções de remoção a uma caixa de seleção via JS. Não apenas quando um usuário seleciona um itemSe você realmente precisar que isso funcione assim, eu faria isso (para garantir que funcione por teclado e mouse)
Infelizmente, o onclick será executado várias vezes (por exemplo, ao ativar o select ... e ao selecionar / fechar) e o onkeypress poderá disparar quando nada mudar ...
fonte
Para disparar corretamente um evento toda vez que o usuário seleciona algo (mesmo a mesma opção), basta enganar a caixa de seleção.
Como outros já disseram, especifique um valor negativo.
selectedIndex
foco para forçar o evento de mudança. Embora isso permita que você engane a caixa de seleção, ela não funcionará depois disso, desde que ainda tenha foco. A correção simples é forçar a caixa de seleção a desfocar, mostrada abaixo.JS / HTML padrão:
Plugin jQuery:
Você pode ver uma demonstração de trabalho aqui .
fonte
Na verdade, os eventos onclick NÃO serão acionados quando o usuário usar o teclado para alterar a seleção no controle de seleção. Pode ser necessário usar uma combinação de onChange e onClick para obter o comportamento que você está procurando.
fonte
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:
Considere usar isto:
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 odisabled
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.
fonte
O que fiz quando enfrentei um Problema semelhante é adicionei um 'onFocus' à caixa de seleção que acrescenta uma nova opção genérica ('selecione uma opção' ou algo semelhante) e a padrão como opção selecionada.
fonte
Portanto, meu objetivo era poder selecionar o mesmo valor várias vezes, que basicamente sobrescreve a função onchange () e transformá-lo em um método onclick () útil.
Com base nas sugestões acima, criei isso que funciona para mim.
http://jsfiddle.net/dR9tH/19/
fonte
onfocus="this.selectedIndex=-1"
soluções: a seleção atual é desativada se você tabular para o componente ou se sair do menu sem selecionar nada. Pressione tab no seu violino para ver o que quero dizer. (Observe também que você obtém um valor em branco e não '-' quando faz isso. IssoselectedIndex=-1
ocorre porque não o leva<option value="-1">
; seria uma ligeira melhoria aqui para usaronfocus="this.selectedIndex=0"
. Essa é uma solução alternativa decente, mas eu não como perder a seleção atual só porque eu olhei para o menu, ou mesmo apenas com guias para ele.Em primeiro lugar, você usa o onChange como manipulador de eventos e, em seguida, usa a variável flag para fazer a função que você deseja toda vez que faz uma alteração
fonte
Adicione uma opção extra como a primeira, como o cabeçalho de uma coluna, que será o valor padrão do botão suspenso antes de clicar nela e redefinir no final de
doSomething()
, portanto, ao escolher A / B / C, o evento onchange sempre dispara, quando a seleção forState
, não faça nada e retorne.onclick
é muito instável como muitas pessoas mencionaram antes. Então, tudo o que precisamos fazer é criar um rótulo de botão inicial diferente das suas verdadeiras opções, para que o onchange funcione em qualquer opção.fonte
A coisa maravilhosa sobre a tag de seleção (nesse cenário) é que ela obterá seu valor das tags de opção.
Experimentar:
Trabalhou decente para mim.
fonte
use jquery:
fonte
Aqui está a minha solução, completamente diferente de qualquer outra aqui. Ele usa a posição do mouse para descobrir se uma opção foi clicada em vez de clicar na caixa de seleção para abrir a lista suspensa. Utiliza a posição event.screenY, pois é a única variável confiável entre navegadores. Um evento de foco deve ser anexado primeiro para que ele possa descobrir a posição dos controles em relação à tela antes do evento de clique.
Aqui está o meu jsFiddle http://jsfiddle.net/sU7EV/4/
fonte
você deveria tentar usar
option:selected
fonte
O que funciona para mim:
Dessa forma, onchange chama 'doSomething ()' quando a opção é alterada e onclick chama 'doSomething ()' quando o evento onchange é falso, ou seja, quando você seleciona a mesma opção
fonte
Tente isso (evento disparado exatamente quando você seleciona a opção, sem alterar a opção):
http://jsbin.com/dowoloka/4
fonte
Aqui você tem o índice retornado e, no código js, você pode usar esse retorno com uma opção ou o que quiser.
fonte
Tente o seguinte:
fonte
Há muito tempo, mas em resposta à pergunta original, isso ajudaria? Basta colocar
onClick
naSELECT
linha. Em seguida, coloque o que deseja que cada umOPTION
faça nasOPTION
linhas. ou seja:fonte
fonte
Eu havia enfrentado uma necessidade semelhante e acabei escrevendo uma diretiva angularjs para a mesma coisa -
link do guthub - seleção angular
Usado
element[0].blur();
para remover o foco da marca de seleção. A lógica é acionar esse desfoque no segundo clique do menu suspenso.as-select
é acionado mesmo quando o usuário seleciona o mesmo valor no menu suspenso.DEMO - link
fonte
A única resposta verdadeira é não usar o campo de seleção (se você precisar fazer algo ao selecionar novamente a mesma resposta).
Crie um menu suspenso com o menu convencional div, button, show / hide. Link: https://www.w3schools.com/howto/howto_js_dropdown.asp
Poderia ter sido evitado se alguém pudesse adicionar ouvintes de eventos às opções. Se houvesse um ouvinte onSelect para o elemento select. E se clicar no campo de seleção não disparar de forma irreversível a ratoeira, mouseup e clicar ao mesmo tempo na ratoeira.
fonte
Há algumas coisas que você deseja fazer aqui para garantir que ele se lembre dos valores mais antigos e acione um evento onchange, mesmo que a mesma opção seja selecionada novamente.
A primeira coisa que você deseja é um evento onChange regular:
Para que o evento onChange seja acionado mesmo quando a mesma opção for selecionada novamente, você pode desmarcar a opção selecionada quando o menu suspenso receber foco, definindo-o como um valor inválido. Mas você também deseja armazenar o valor selecionado anteriormente para restaurá-lo, caso o usuário não selecione nenhuma nova opção:
O código acima permitirá que você ative a troca mesmo que o mesmo valor esteja selecionado. No entanto, se o usuário clicar fora da caixa de seleção, você deseja restaurar o valor anterior. Fazemos isso no onBlur:
fonte
Observe que os manipuladores de eventos não são compatíveis com a tag OPTION no IE, com um pensamento rápido ... Eu vim com essa solução, tente e me dê seu feedback:
O que estou fazendo aqui, na verdade, é redefinir o índice de seleção para que o evento onchange seja acionado sempre, é verdade que você perde o item selecionado ao clicar e pode ser irritante se sua lista for longa, mas pode ajudá-lo de alguma maneira ..
fonte
que tal mudar o valor do select quando o elemento ganha foco, por exemplo (com jquery):
fonte
Eu descobri esta solução.
defina o selectedIndex do elemento select como 0 inicialmente
chame esse método de evento onChange
fonte