2010-12-17 7 views

Respuesta

269

La respuesta corta:

utilizar el evento click, que no se disparará hasta después de que el valor ha sido actualizado, y los incendios cuando lo desee a:

<label><input type='checkbox' onclick='handleClick(this);'>Checkbox</label> 

function handleClick(cb) { 
    display("Clicked, new value = " + cb.checked); 
} 

Live example | Source

La respuesta larga:

El manejador change evento no se conoce hasta que el estado checked se ha actualizado (live example | source), pero debido a que (como señala Tim Büthe en los comentarios) IE doesn No dispare el evento change hasta que la casilla de verificación pierda el foco, no recibe la notificación proactivamente. Peor aún, con IE si hace clic en la etiqueta para la casilla de verificación (en lugar de la casilla de verificación) para actualizarla, puede tener la impresión de que está obteniendo el valor anterior (pruébelo con IE aquí haciendo clic en la etiqueta: live example | source). Esto se debe a que si la casilla de verificación tiene foco, al hacer clic en la etiqueta se aleja del foco, activando el evento change con el valor anterior, y luego el click sucede configurando el nuevo valor y configurando nuevamente el foco en la casilla de verificación. Muy confuso.

Pero puede evitar todo lo desagradable si en su lugar usa click.

manipuladores Dom0 que he usado (onxyz atributos) porque eso es lo que preguntaste, pero para que conste, yo por lo general recomendamos que conecte los manipuladores de código (addEventListener de DOM2 o attachEvent en las versiones antiguas de IE) en lugar de utilizar onxyz atributos. Eso le permite asociar múltiples manejadores al mismo elemento y le permite evitar hacer todas las funciones globales de sus manejadores.


Una versión anterior de esta respuesta utiliza este código para handleClick:

function handleClick(cb) { 
    setTimeout(function() { 
    display("Clicked, new value = " + cb.checked); 
    }, 0); 
} 

El objetivo parecía ser la de permitir que el clic para completar antes de mirar el valor. Por lo que sé, no hay ninguna razón para hacer eso, y no tengo idea de por qué lo hice. El valor se cambia antes de llamar al controlador click. De hecho, la especificación es quite clear about that. La versión sin setTimeout funciona perfectamente en todos los navegadores que he probado (incluso en IE6). Solo puedo suponer que estaba pensando en alguna otra plataforma donde el cambio no se realiza hasta después del evento. En cualquier caso, no hay razón para hacer eso con casillas de verificación HTML.

+4

Afortunadamente 'onchange' funciona correctamente en' + IE9'. [Fuente] (http://www.quirksmode.org/dom/events/change.html) – Mori

+0

Agregando mis 2 centavos aquí: Parece que IE8 (y más abajo, supongo), diferencia entre un clic y un clic ...y que la razón por la que estamos en esta página es porque se activa al hacer clic en lugar de hacer clic en el botón de liberación. Parece que las casillas de verificación solo se activan al hacer clic: al hacer clic y luego mover el mouse se registrará un clic, pero no se modificará una casilla de verificación. – dah97765

+2

Parece que alternar la casilla de verificación mediante la navegación por el teclado ('tab' +' space') también activará el manejador 'onclick' (verificado en Chrome 51, al menos). –

2

Utilice esta

<input type="checkbox" onclick="onClickHandler()" id="box" /> 

<script> 
function onClickHandler(){ 
    var chk=document.getElementById("box").value; 

    //use this value 

} 
</script> 
Cuestiones relacionadas