2012-04-15 13 views
23

Escribí este fragmento de javascript/jQuery para cambiar una casilla de verificación. http://jsfiddle.net/johnhoffman/crF93/¿Por qué el cambio dinámico de una casilla de verificación no activa un evento de cambio de formulario?

Javascript

$(function() { 
    $("a").click(function() { 
     if ($("input[type='checkbox']").attr('checked') == "checked") 
      $("input[type='checkbox']").removeAttr('checked'); 
     else 
      $("input[type='checkbox']").attr('checked', 'checked'); 
     return false; 
    }); 

    $("input[type='checkbox']").change(function(){ 
     console.log("Checkbox changed.");    
    });  
});​ 

HTML

<input type="checkbox" /> 
<a href="#">Change CheckBox</a>​ 

Curiosamente, haga clic en el enlace altera el cuadro de texto, pero no activa el evento de cambio de forma que llama a la función que registra un mensaje en Chrome Consola de desarrollador web. ¿Por qué? ¿Cómo hago para que haga eso?

+0

[ "El evento de cambio se produce cuando un control pierde el foco de entrada y su valor se ha modificado desde ganando enfoque. "] (http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-htmlevents) Sin cambio de enfoque significa que no hay evento de cambio. –

+0

posible duplicado de [evento onchange no disparar cuando el cambio proviene de otra función] (http: // stackoverflow.com/questions/7055729/onchange-event-not-fire-when-the-change-come-from-antoher-function) –

Respuesta

24

Es necesario para desencadenar el evento de cambio, .trigger('change'), por lo que sabe que evento tuvo lugar un cambio.

De http://api.jquery.com/change/:

Descripción: Enlazar un controlador de eventos para el "cambio" evento JavaScript o desencadenar ese evento en un elemento.

Este método es un atajo para .on("change", handler) en las dos primeras variaciones, y .trigger("change") en la tercera.

El evento change se envía a un elemento cuando cambia su valor. Este evento está limitado a <input> elementos, <textarea> cajas y <select> elementos. Para cuadros de selección, casillas de verificación y botones de opción, el evento se dispara inmediatamente cuando el usuario hace una selección con el mouse, pero para los otros tipos de elementos el evento se aplaza hasta que el elemento pierde el foco.

Demostración:

http://jsfiddle.net/nPkPw/3/

Uso de encadenamiento: http://jsfiddle.net/nPkPw/5/
es decir $("input[type='checkbox']").trigger('change').attr('checked', 'checked');

+1

parece un poco prolijo para simular un clic – Sinetheta

+0

@Sinetheta Hiya cooleos lo recortará un poco. :) cheerios! –

+5

para referencia futura, tuve que poner el disparador después del attr así que mi script para ver cuál era el cambio. – Yohn

10

Esto no es sorprendente, pero supongo que podría hacer esto en la lista de no efecto in the msdn.

  • "Este evento se activa cuando los contenidos están comprometidos y no mientras el valor está cambiando."
  • "El evento onchange no se activa cuando la opción seleccionada del objeto seleccionado se cambia programáticamente."

siempre se puede simplemente .click() que jsFiddle

Cuestiones relacionadas