2010-01-29 12 views
5

sto usando Prototype per monitorare le caselle di controllo, in modo da posso aggiungere javascript controlli a loro. Quando viene cliccato il tr o td in cui si trova la casella di controllo, è necessario selezionare la casella di controllo.
Quando si fa clic direttamente su una casella di controllo, viene attivato l'evento onchange, quindi riceverai un avviso. Quando il valore della casella di controllo 'viene modificato da javascript (quando si fa clic sul tr o td), onchange non viene attivato. Perché non si attiva la funzione onchange quando la casella di controllo viene modificata indirettamente?Perché onchange su una casella di controllo non generato quando la casella è cambiato indirettamente

Questo è il javascript che sto utilizzando.

Element.observe(window, 'load', function() { 
     /* If a tr or td is clicked, change the value of the checkbox. */ 
     $$('#results tr').each(function(el) { 
      el.observe('click', function(e) { 
       if(!e.target) { e.target = e.srcElement; } 
       if(e.target.nodeName == 'TD' || e.target.nodeName == 'TR') { 
        $('compare-product'+this.id).checked = ($('compare-product'+this.id).checked === false) ? true : false; 
       } 
      }); 
     }); 
     /* Monitor if the status of a checkbox has changed. */ 
     $$('#results tr td input').each(function(el) { 
       el.observe('change', function(e) { 
         alert('!'); 
        } 
       ); 
      } 
     ); 
    } 
); 

L'ho provato in Firefox e IE7, entrambi non funzionano. Non sto cercando una soluzione alternativa, sono solo curioso di sapere perché questo non funziona.

+0

Se lo fosse, che cosa accadrebbe se nel codice di gestione degli eventi è stato modificato lo stato della casella di controllo? –

+0

Non capisco cosa intendi. – Robin

+0

Se si modifica lo stato nel gestore pari, verrà richiamato lo stesso gestore eventi. In tal caso, potresti avere un ciclo infinito. –

risposta

5

questo non è raro in quadri di interfaccia utente in generale. Se si modifica lo stato di un controllo a livello di codice, si presume che sia anche in grado di attivare a livello di codice qualsiasi effetto collaterale che si suppone di avere. Offre ai programmatori una maggiore flessibilità ed evita bug in cui lo stato è in fase di flussaggio durante l'inizializzazione o il teardown. (Ad esempio, durante l'inizializzazione, è possibile impostare lo stato di un controllo prima di impostare lo stato di quelli diversi dipendenti. Se il gestore cambiamento per i primi fuochi controllo immediatamente, eseguirà mentre gli altri controlli sono in uno stato incoerente.)

0

Il vero motivo per cui non è possibile farlo è perché si tratta di un problema di sicurezza nel modello di programmazione. Gli eventi che non sono stati avviati dall'utente di solito non sono concatenati. Quindi, anche se l'impostazione di un valore va bene, non è corretto andare avanti e attivare gli eventi impostati su quel controllo.

Cosa jamesdlin ha detto non ha senso.

Jamesdlin:.

"Per esempio, durante l'inizializzazione, è possibile impostare lo stato di un controllo prima di impostare lo stato di diversi quelli dipendenti Se il gestore cambiamento per i primi fuochi di controllo immediatamente, verrà eseguito mentre gli altri controlli si trovano in uno stato incoerente. "

Questo è vero non importa se si imposta a livello di codice un valore o se si fa clic sul controllo. In entrambi i casi potresti avere altri controlli dipendenti.

+0

Il mio punto era che durante * l'inizializzazione * alcuni controlli potrebbero non essere ancora completamente inizializzati (e quindi potrebbero avere valori inattesi). – jamesdlin