Estoy buscando una solución generalizada para esto.
Considere 2 entradas de tipo de radio con el mismo nombre. Cuando se envía, el que está marcado determina el valor que se envía con el formulario:
<input type="radio" name="myRadios" onchange="handleChange1();" value="1" />
<input type="radio" name="myRadios" onchange="handleChange2();" value="2" />
El evento de cambio no se activa cuando se desactiva un botón de radio. Entonces, si la radio con valor = "1" ya está seleccionada y el usuario selecciona la segunda, handleChange1 () no se ejecuta. Esto presenta un problema (para mí de todos modos) en que no hay ningún evento en el que pueda detectar esta des-selección.
Lo que me gustaría es una solución alternativa para el evento onchange para el valor del grupo de casillas de verificación o, alternativamente, un evento oncheck que detecte no solo cuando una radio está marcada sino también cuando no está marcada.
Estoy seguro de que algunos de ustedes se han encontrado con este problema antes. ¿Cuáles son algunas soluciones alternativas (o idealmente, cuál es la forma correcta de manejar esto)? Solo quiero ver el evento de cambio, acceder a la radio previamente verificada, así como a la radio recién verificada.
PS
onclick parece un mejor evento (cross-browser) para indicar cuándo se verifica una radio, pero aún así no resuelve el problema no verificado.
Supongo que tiene sentido por qué onchange para un tipo de casilla de verificación funciona en un caso como este, ya que cambia el valor que envía cuando lo marca o desmarca. Desearía que los botones de radio se comportaran más como el cambio de un elemento SELECT, pero qué puedes hacer ...
fuente
myRadios
para leer la variableprev
que contiene la radio seleccionada actualmente. Se realiza una comparación dentro de cada controlador de clics para decidir si la radio clicada es la misma que la almacenadaprev
y, de lo contrario, la radio clicada actualmente se almacena allí. Dentro del controlador de clics, tiene acceso a laprev
radio seleccionada previamente: y la radio seleccionada actualmente:this
rad[i].addEventListener('change', function(){ //your handler code })
y funcionará tanto para mouse como para tecladoHaría dos cambios:
onclick
controlador en lugar deonchange
: está cambiando el "estado verificado" de la entrada de radio, no elvalue
, por lo que no está ocurriendo un evento de cambio.this
como parámetro, lo que facilitará verificar qué valor está seleccionado actualmente.ETA: junto con su
handleClick()
función, puede rastrear el valor original / antiguo de la radio en una variable de ámbito de página. Es decir:fuente
onclick
controlador tiene un nombre incorrecto: maneja el evento de selección del botón de opción si se hace clic, se toca o se activa el botón presionando "enter" en un teclado. Elonchange
controlador no es apropiado en este caso ya que el valor de la entrada no cambia, solo el atributo marcado / no marcado. He agregado un script de ejemplo para abordar el valor anterior.Como puede ver en este ejemplo: http://jsfiddle.net/UTwGS/
HTML:
jQuery:
tanto el
click
ychange
eventos se activan al seleccionar un botón de opción (por lo menos en algunos navegadores).También debo señalar que, en mi ejemplo, el
click
evento aún se dispara cuando usa la pestaña y el teclado para seleccionar una opción.Entonces, mi punto es que, aunque el
change
evento se dispara en algunos navegadores, elclick
evento debe proporcionar la cobertura que necesita.fuente
console.log
declaración en mi código que IE7 no admite. Podrías alertarlo en IE si quisieras.click
ychange
controladores de eventos, que va a terminar llama al gestor dos veces. En este caso, dado que @Matthew está preocupado por el valor anterior, eso podría tener malas consecuencias.click
es el controlador correcto aquí y el único que necesita. Su revisión aclara eso, así que estoy eliminando mi voto negativo.¿Qué pasa con el uso del evento de cambio de Jquery?
jsfiddle: http://jsfiddle.net/f8233x20/
fuente
$(this).val()
también se puede reemplazar con javascript nativoe.currentTarget.value
, donde e es el objeto de evento pasado a través de la función de devolución de llamada.Como puede ver aquí: http://www.w3schools.com/jsref/event_onchange.asp El atributo onchange no es compatible con los botones de opción.
La primera pregunta SO vinculada por usted le da la respuesta: use el
onclick
evento en su lugar y verifique el estado del botón de radio dentro de la función que activa.fuente
onclick
no es la misma semántica, ya que puede cambiar la comprobación de un botón de radio a través de la entrada del teclado si se habilita la selección de forma del teclado.No creo que haya otra forma que no sea almacenar el estado anterior. Aquí está la solución con jQuery
Después de pensarlo un poco más, decidí deshacerme de la variable y agregar / eliminar clase. Esto es lo que obtuve: http://jsfiddle.net/BeQh3/2/
fuente
Sí, no hay evento de cambio para el botón de opción seleccionado actualmente. Pero el problema es cuando cada botón de radio se toma como un elemento separado. En cambio, un grupo de radio debe considerarse un elemento único como
select
. Por lo tanto, se activa el evento de cambio para ese grupo. Si es unselect
elemento, nunca nos preocupamos por cada opción, sino que solo tomamos la opción seleccionada. Almacenamos el valor actual en una variable que se convertirá en el valor anterior, cuando se selecciona una nueva opción. De manera similar, debe usar una variable separada para almacenar el valor del botón de opción marcado.Si desea identificar el botón de radio anterior, debe realizar un bucle en el
mousedown
evento.mira esto: http://jsfiddle.net/diode/tywx6/2/
fuente
Almacene la radio marcada anterior en una variable:
http://jsfiddle.net/dsbonev/C5S4B/
HTML
JS
CÓDIGO DE EJEMPLO JS
fuente
Me doy cuenta de que este es un problema antiguo, pero este fragmento de código funciona para mí. Quizás alguien en el futuro lo encuentre útil:
fuente
onkeydown="radioChange('juju','button1',radioArray);"
, también podría capturar cuando un usuario usa espacio para revisar la radio.Esto está justo en la parte superior de mi cabeza, pero podría hacer un evento onClick para cada botón de radio, darles todas las ID diferentes y luego hacer un bucle for en el evento para pasar por cada botón de radio en el grupo y encontrar cuál es se verificó mirando el atributo 'verificado'. La identificación de la marcada se almacenaría como una variable, pero es posible que desee usar una variable temporal primero para asegurarse de que el valor de esa variable haya cambiado, ya que el evento de clic activará si se marcó o no un nuevo botón de opción.
fuente
fuente
Si desea evitar el guión en línea, simplemente puede escuchar un evento de clic en la radio. Esto se puede lograr con Javascript simple escuchando un evento de clic en
fuente
Puede agregar el siguiente script JS
fuente
esto funciona para mi
fuente
Esta es la función más fácil y más eficiente de usar, simplemente agregue tantos botones como desee al marcado = falso y haga que el evento onclick de cada botón de radio llame a esta función. Designe un número único para cada botón de radio
fuente
La manera más fácil y poderosa
leer solo entradas de radio usando getAttribute
fuente