2012-04-15 12 views
23

Ho scritto questo snippet di javascript/jQuery per cambiare una casella di controllo. http://jsfiddle.net/johnhoffman/crF93/Perché la modifica dinamica di una casella di controllo non attiva un evento di modifica del modulo?

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>​ 

È interessante notare che, cliccando sul link altera la casella di testo, ma non attiva l'evento di modifica modulo che chiama la funzione che registra un messaggio in Chrome Console per gli sviluppatori Web. Perché? Come faccio a farlo?

+0

[ "L'evento cambiamento si verifica quando un controllo perde il focus e il suo valore è stato modificato dal guadagnando attenzione. "] (http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings-htmlevents) Nessun cambiamento di messa a fuoco significa nessun evento di cambiamento. –

+0

possibile duplicato di [evento onchange non attivato quando la modifica proviene dalla funzione antoher] (http: // stackoverflow.it/questions/7055729/onchange-event-not-fire-when-the-change-come-from-antoher-function) –

risposta

24

È necessario attivare l'evento cambiamento, .trigger('change'), in modo tale evento sa che un cambiamento ha avuto luogo.

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

Descrizione: Associare un gestore di eventi per il "cambiamento" evento JavaScript, o innescare l'evento su un elemento.

Questo metodo è una scelta rapida per .on("change", handler) nelle prime due varianti e .trigger("change") nella terza.

L'evento change viene inviato a un elemento quando il suo valore cambia. Questo evento è limitato agli elementi <input>, alle caselle <textarea> e agli elementi <select>. Per le caselle di selezione, le caselle di controllo e i pulsanti di opzione, l'evento viene attivato immediatamente quando l'utente effettua una selezione con il mouse, ma per gli altri tipi di elemento l'evento viene posticipato fino a quando l'elemento non si concentra.

Dimostrazione:

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

usando concatenazioni: http://jsfiddle.net/nPkPw/5/
cioè $("input[type='checkbox']").trigger('change').attr('checked', 'checked');

+1

sembra un po 'prolisso per simulare un clic – Sinetheta

+0

@Sinetheta Hiya cooleos lo tratterà un po'. :) cheerios! –

+5

per riferimento futuro, ho dovuto mettere il trigger dopo l'attr così il mio script per vedere quale fosse il cambiamento. Il trigger – Yohn

10

Questo non è sorprendente, ma suppongo che si potrebbe in questo modo alla lista di non-effetto in the msdn.

  • "Questo evento viene generato quando il contenuto è impegnato e non mentre il valore sta cambiando."
  • "L'evento onchange non viene attivato quando l'opzione selezionata di dell'oggetto selezionato viene modificata a livello di programmazione."

Si può sempre e solo .click() si jsFiddle

Problemi correlati