Estou procurando uma solução generalizada para isso.
Considere 2 entradas do tipo de rádio com o mesmo nome. Quando enviado, o que é verificado determina o valor que é enviado com o formulário:
<input type="radio" name="myRadios" onchange="handleChange1();" value="1" />
<input type="radio" name="myRadios" onchange="handleChange2();" value="2" />
O evento de alteração não é acionado quando um botão de opção é desmarcado. Portanto, se o rádio com o valor = "1" já estiver selecionado e o usuário selecionar o segundo, handleChange1 () não será executado. Isso apresenta um problema (pelo menos para mim), pois não há nenhum evento em que eu possa pegar essa desmarcação.
O que eu gostaria é uma solução alternativa para o evento onchange para o valor do grupo de caixas de seleção ou, alternativamente, um evento oncheck que detecta não apenas quando um rádio é marcado, mas também quando está desmarcado.
Tenho certeza de que alguns de vocês já enfrentaram esse problema antes. Quais são algumas soluções alternativas (ou, idealmente, qual é a maneira correta de lidar com isso)? Eu só quero pegar o evento de mudança, acessar o rádio verificado anteriormente, bem como o rádio verificado recentemente.
O PS
onclick parece ser um evento melhor (entre navegadores) para indicar quando um rádio é verificado, mas ainda não resolve o problema não verificado.
Suponho que faça sentido por que a troca de um tipo de caixa de seleção funciona em um caso como esse, pois altera o valor que ele envia quando você a marca ou desmarca. Desejo que os botões de opção se comportem mais como a troca de um elemento SELECT, mas o que você pode fazer ...
fonte
myRadios
para ler a variávelprev
que contém o rádio atualmente selecionado. É feita uma comparação dentro de cada manipulador de cliques para decidir se o rádio clicado é o mesmo que o armazenadoprev
e, se não, o rádio clicado atualmente é armazenado lá. Dentro do manipulador de clique, você tem acesso ao previamente selecionados:prev
eo rádio selecionado:this
rad[i].addEventListener('change', function(){ //your handler code })
e que irá trabalhar para ambos mouse e tecladoEu faria duas alterações:
onclick
manipulador em vez deonchange
- você está alterando o "estado verificado" da entrada de rádio, não ovalue
, para que não ocorra um evento de alteração.this
como parâmetro, que facilitará a verificação de qual valor está selecionado no momento.ETA: Juntamente com sua
handleClick()
função, você pode rastrear o valor original / antigo do rádio em uma variável com escopo de página. Isso é:fonte
onclick
manipulador é apenas nomeado mal - ele lida com o evento da seleção do botão de opção, se o botão é clicado, tocado ou ativado pressionando "enter" em um teclado. Oonchange
manipulador não é apropriado neste caso, pois o valor da entrada não muda, apenas o atributo marcado / não verificado. Adicionei um exemplo de script para abordar o valor anterior.Como você pode ver neste exemplo: http://jsfiddle.net/UTwGS/
HTML:
jQuery:
os eventos
click
echange
são disparados ao selecionar uma opção de botão de opção (pelo menos em alguns navegadores).Devo também salientar que, no meu exemplo, o
click
evento ainda é acionado quando você usa a guia e o teclado para selecionar uma opção.Portanto, o que quero dizer é que, embora o
change
evento tenha sido disparado em alguns navegadores, oclick
evento deve fornecer a cobertura necessária.fonte
console.log
declaração no meu código, que o IE7 não suporta. Você poderia alertá-lo no IE, se quisesse.click
echange
manipuladores de eventos, você vai acabar chamando o manipulador de duas vezes. Nesse caso, como o @Matthew se preocupa com o valor anterior, isso pode levar a consequências ruins.click
é o manipulador correto aqui e o único que você precisa. Sua revisão esclarece isso, então estou removendo meu voto negativo.Que tal usar o evento de mudança do Jquery?
jsfiddle: http://jsfiddle.net/f8233x20/
fonte
$(this).val()
também pode ser substituído por javascript nativoe.currentTarget.value
, em que e é o objeto de evento passado pela função de retorno de chamada.Como você pode ver aqui: http://www.w3schools.com/jsref/event_onchange.asp O atributo onchange não é suportado por botões de opção.
A primeira pergunta SO vinculada por você fornece a resposta: use o
onclick
evento e verifique o estado do botão de opção dentro da função que ele aciona.fonte
onclick
não é a mesma semântica, pois você pode alterar a verificação de um botão de opção através da entrada do teclado, pois a seleção de formulário do teclado está ativada.Não acho que exista outra maneira de armazenar o estado anterior. Aqui está a solução com o jQuery
Depois de pensar um pouco mais sobre isso, decidi me livrar da variável e adicionar / remover classe. Aqui está o que eu tenho: http://jsfiddle.net/BeQh3/2/
fonte
Sim, não há evento de alteração para o botão de opção atualmente selecionado. Mas o problema é quando cada botão de opção é considerado um elemento separado. Em vez disso, um grupo de rádio deve ser considerado um único elemento como
select
. Portanto, o evento de mudança é acionado para esse grupo. Se é umselect
elemento, nunca nos preocupamos com cada opção, mas apenas com a opção selecionada. Armazenamos o valor atual em uma variável que se tornará o valor anterior, quando uma nova opção for selecionada. Da mesma forma, você deve usar uma variável separada para armazenar o valor do botão de opção marcado.Se você deseja identificar o botão de opção anterior, é necessário ligar
mousedown
evento.veja isto: http://jsfiddle.net/diode/tywx6/2/
fonte
Armazene o rádio verificado anteriormente em uma variável:
http://jsfiddle.net/dsbonev/C5S4B/
HTML
JS
CÓDIGO EXEMPLO JS
fonte
Sei que esse é um problema antigo, mas esse trecho de código funciona para mim. Talvez alguém no futuro considere útil:
fonte
onkeydown="radioChange('juju','button1',radioArray);"
também poderá capturar quando um usuário usar espaço para verificar o rádio.Isso está no topo da minha cabeça, mas você pode fazer um evento onClick para cada botão de opção, fornecer todos os IDs diferentes e criar um loop for no evento para percorrer cada botão de opção do grupo e descobrir qual é foi verificado olhando o atributo 'marcado'. O ID do verificado seria armazenado como uma variável, mas convém usar uma variável temporária primeiro para garantir que o valor dessa variável seja alterado, pois o evento click seria acionado se um novo botão de opção fosse verificado ou não.
fonte
fonte
Se você deseja evitar o script embutido, pode simplesmente ouvir um evento de clique no rádio. Isso pode ser conseguido com Javascript simples ouvindo um evento de clique em
fonte
Você pode adicionar o seguinte script JS
fonte
isso funciona para mim
fonte
Essa é a função mais fácil e eficiente a ser usada, basta adicionar quantos botões você desejar ao selected = false e fazer com que o evento onclick de cada botão de opção chame essa função. Designe um número exclusivo para cada botão de opção
fonte
Maneira mais fácil e potente
leia apenas entradas de rádio usando getAttribute
fonte