2013-02-08 10 views
9

Quando ho aggiunto una selezione all'etichetta e l'associazione per l'evento click, jquery si attiva due volte.jquery binding clicca per l'attivazione dell'etichetta due volte

http://jsfiddle.net/d8Ax7/

html:

<label class="lol"> 
    <div> 
     bla 
    </div> 
    <div style="display:none;"> 
     <select></select> 
    </div> 
</label> 

javascript:

$("label.lol").on({ 
    click : function() 
    { 
     alert(1); 
    } 
}) 

come posso risolvere questo bug senza l'aggiunta di "per" attributo per le etichette?

+0

interessante. Sembra che tu possa usare solo il contenuto di frasi all'interno di un tag etichetta che non include le div. [Fonte] (https://developer.mozilla.org/en-US/docs/HTML/Content_categories#Phrasing_content) –

+0

trigger ubuntu/firefox una volta nel tuo violino – mikakun

+0

funziona come previsto quando selezioni solo il primo div all'interno di $ ("label.lol div: first") ' – sofl

risposta

5

So che ci sono già molte risposte a questa domanda ma sono vaghe.

$("label.lol").on({ 
    click : function() 
    { 
     alert(1); 
     return false; 
    } 
}); 

Ok, tutti hanno apprezzato. Problema risolto. Ma sorge la domanda Perché return false;.

Risposta in parole semplici: È un modo di dire al computer che restituisce dalla funzione, l'attività che ho dato a voi è completata. Niente più pasticci ora.

+0

grazie all'Aspirante Aquib; ha funzionato. Cosa ne pensi è un bug? L'evento –

+0

click si propaga o bolla il DOM che lo fa girare due volte. Uno a sé stante e altri tag di selezione (o qualsiasi altro elemento di forma) tra di essi. Puoi vedere questo violino: http://jsfiddle.net/5QAS2/ ** Cosa c'è dentro? ** Vedi che quando 'input' o qualsiasi altro tag si trova tra l'elemento label, la funzione viene eseguita due volte. E non quando gli elementi del form non sono in esso. Non ho fatto una ricerca su questo. Quindi, non posso spiegare di più o non posso dire che sia un bug o qualcosa del genere. Si! –

+0

E un'altra cosa è che se dovrebbe avvertire tre volte se ci sono due ingressi. Quale no. Vedi: http://jsfiddle.net/5QAS2/1/ Quindi, penso che sia un bug. Non possiamo dire che sta ribollendo il DOM. Bene, ti suggerisco di "restituire falso": ogni volta che scrivi un programma. –

0
$("label.lol").off("click").on(//... 

ma se è sparare due volte significa sicuramente avete legato due volte in modo da utilizzare .OFF è più un hack che la migliore soluzione al vostro problema, che sarebbe quello di capire come si finisce vincolante due volte questo evento .. . & sicuramente il codice si mostra non spiega questo doppio legame

edit: & nel vostro violino per davvero innescare una sola volta ...

2

si potrebbe provare a utilizzare il marchio del "per" attributo per collegarlo ad una selezione al di fuori di esso. Vedere il mio esempio

<label for="test" class="lol"> 
    <div> 
     bla 
    </div> 
</label> 

<div style="display:none;"> 
    <select id="test"></select> 
</div> 

http://jsfiddle.net/d8Ax7/1/

+0

quote: "Come posso correggere questo errore senza aggiungere" per "attributo alle etichette?" – sofl

+0

Ah, mi dispiace quindi restituire semplicemente false dal gestore: http://jsfiddle.net/d8Ax7/3/ –

+0

beh, ahh uomo stai aggiornando la tua risposta? Va bene. E @sofl usa 'return false;' sempre nel tuo codice. –

0

questo modo che funziona troppo, ma sono non comprendere appieno quello che stai cercando di fare ... E un'etichetta deve contenere solo un testo etichetta per la selezione e non contiene lo stesso scegliere ..

$("label.lol div:first").on({ 
     click : function() 
     { 
      alert(1); 
     } 
    }) 
0

ci sono due opzioni quando imperativi il clic verificare questa domanda stack overflow per maggiori dettagli, ma per riassumere provate questo ...

$("label.lol").click(function() { 
     alert(1); 
     return false; 
}); 
0

Il tuo markup è orribile .. Il tuo problema è che jquery sta facendo l'evento click su ogni div all'interno della tua funzione label - significa due volte. Dovresti pulire il tuo markup e chiedere al div che vuoi essere cliccabile direttamente. uso Else: prima per assicurarsi che l'evento viene generato solo una volta:

$('.lol div:first').click(function() 
{ 
    alert("1"); 
}) 
+0

Hai ragione riguardo al markup. Ma l'evento spara sull'etichetta. Prova a sostituire 'alert (" 1 ")' con 'alert (this)' e vedrai che mostra '[object HTMLLabelElement]' due volte. – fragmentedreality

0

Si dovrebbe aggiungere e.preventDefault();

$("label.lol").on({ 
    click : function (e) 
    { 
    alert(1); 
    e.preventDefault(); 
    } 
}); 
0

il tuo problema è con la tua distinzione tra elements.e.g è necessario selezionare il primo figlio di un'etichetta con :first-child selettore, o dargli un id:

HTML:

<label class="lol"> 
    <div id="first-child"> 
     bla 
    </div> 
    <div style="display:none;"> 
     <select></select> 
    </div> 
</label> 

JS:

$("#first-child").on('click',function(){ 
     alert(1); 
}); 

http://jsfiddle.net/d8Ax7/5/

0

Prova a filtrare con CSS: aggiungi un int ermediate class clicked che impedisce il secondo avviso (o qualsiasi altra azione) e che rimuova lo .clicked per essere pronto per il prossimo round.

$("label.lol").on({ 
    click : function() 
    { 
     if (! $(this).hasClass('clicked')) 
      alert(1); 
     $(this).toggleClass('clicked'); 
    } 
}) 
Problemi correlati