2009-07-24 12 views
13

Applico:Perché il gestore dei clic di jQuery sembra essere eseguito più volte per alcuni dei suoi target?

$(".newContentLink").click(function() { 
    $("#test").append("1"); 
}); 

In questa:

<span id="contents"> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
<span id="content1" class="content study"> 
</span> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
<span id="content3" class="content study"> 
</span> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
<span id="content4" class="content category"> 
</span> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
</span> 

Come mai quando clicco sui primi 2 bottoni che aggiunge 111, il pulsante successivo aggiunge 11, e l'ultimo si aggiunge 1?

+1

provare apending un "

" invece di "1", –

+0

Dov'è #test? Forse è qualcosa con quel codice – MacAnthony

risposta

20

Impossibile replicare. Sospetto che tu stia rappresentando in modo errato — semplificando eccessivamente, per lo più la tua situazione è la —. Per essere precisi, credo che tu stia aggiungendo dinamicamente quegli input e chiamando $(".newContentLink").click(...) ogni volta — che, naturalmente, continua ad applicare copie aggiuntive del gestore di clic a ciascun .newContentLink nella pagina.

Quindi l'input più recente che hai creato ha una copia del gestore di clic e aggiunge uno 1. Il secondo più recente ha due copie e aggiunge 11. Il terzo ha tre e aggiunge 111, ecc

Per evitare questo, si applica il gestore semplice clic elemento DOM appena creato, non $(".newContentLink") (che significa sempre ogni.newContentLink).

+4

Sì, è quasi sicuramente il gestore di click che viene aggiunto ancora e ancora. – Blixt

+2

Oppure usa il metodo .live() per aggiungere dinamicamente l'evento – MacAnthony

1

Provare a dare nomi diversi agli elementi di input di invio.

+0

Mi piacerebbe ma sono formati in un loop dal mio script (ho solo messo quello che spero sia la parte rilevante del codice lassù). – Eliyahu

+1

Sono solo preoccupato che potrebbe avere qualcosa a che fare con la definizione del controllo di successo. – EFraim

2

Non un bug jQuery - Working Demo

Ci deve essere un problema con qualcosa d'altro nel codice. Dov'è l'elemento con id="test" nel tuo markup?

EDIT:

Basta leggere chaos' answer, che suona come una spiegazione plausibile.

A proposito, ids elemento deve essere univoco all'interno markup HTML - questo fa parte della specifica HTML e può essere un altro possibile spiegazione

6

Come chaos says, probabilmente stai chiamando click() ogni volta che si aggiunge uno, e stanno accumulando.

Se si aggiungono questi elementi al documento in modo dinamico e occorre assicurarsi che questa funzione sia stata aggiunta a tutti quelli che si aggiungono, come utilizzare l'applicazione live?

$('#contents').on('click', '.newContentLink', function() { 
    $("#test").append("1"); 
}); 

Questo farà in modo la regola viene applicata in modo dinamico una volta a qualsiasi classe di qualificazione nel documento.

+0

Whoops, MacAnthony lo ha già suggerito. –

+2

Credo che la sintassi dovrebbe essere .live ('click', function() { – MacAnthony

+0

Questo codice non ha funzionato per me. Ho controllato i documenti, e questo ha fatto: $ (". NewContentLink"). Live ("click ", function() {$ (" # test "). append (" 1 ");}); – Eliyahu

1

Ho avuto un problema simile .... Ho capito che stavo applicando la funzione di modifica in un ciclo ... i.e. il mio codice in precedenza era ....

$("table#UserIRTable > tbody > tr").each(function() 
{ 
    .............. 
    .............. 

    $("input[id='thisMonthSupply']").change(function(e){ 
     ...... 
    }); 
    .......... 
    .......... 
} 

ha preso la funzione di cambio fuori e bingo ... ha funzionato .....

2

per assicurarsi che la funzione di eseguire solo una volta su un evento click voi può usare $ (". newContentLink").uno();

$(".newContentLink").one(function() { 
    $("#test").append("1"); 
}); 
7

o si può associare l'evento click ogni volta che si aggiunge un nuovo elemento

$('.newContentLink').unbind('click'); 

$(".newContentLink").click(function() { 
    $("#test").append("1"); 
}); 
Problemi correlati