2013-10-25 25 views
11

Tıklama olayım neden jquery'de iki kez ateşlendi?Tıklama olayım neden jquery'de iki kez çağrıldı?

HTML

<ul class=submenu> 
    <li><label for=toggle><input id=toggle type=checkbox checked>Show</label></li> 
</ul> 

JavaScript

$("ul.submenu li:contains('Show')").on("click", function(e) { 
    console.log("toggle"); 
    if ($(this).find("[type=checkbox]").is(":checked")) console.log("Show"); 
    else console.log("Hide"); 
}); 

Bu ne konsolda olsun: Yanlış hatırlamıyorsam

toggle      menu.js:39 
Show      menu.js:40 
toggle      menu.js:39 
Hide      menu.js:41 


> $("ul.submenu li:contains('Show')") 
[<li>​           ] 
    <label for=​"toggle">​ 
     <input id=​"toggle" type=​"checkbox" checked>​ 
     "Show" 
    </label>​ 
</li>​ 
+0

Yalnızca bir kez denediğimde bir kez tetikler http://jsfiddle.net/LRjUc/ –

+0

@DominicGreen: Bu Etiketi veya onay kutusunu (veya "li") tıklayın. Etiketi tıklarsanız, en azından Chrome'da, her iki etkinliği de alırsınız. –

+0

Evet, görmesi biraz zor ama konsoldaki son metni seçerseniz, olayın bundan sonra iki kez ateşlendiğini görebilirsiniz. – shuji

cevap

25

, en azından bazı bu davranışı gördüm tarayıcıları, öğesinin her ikisini de tıklattığınızda, input'da labelve tuşlarına bir tıklamayı tetikler.

e.target.tagName'un "LABEL" olduğu olayları görmezden gelirseniz, yalnızca bir etkinlik alırsınız. En azından, benim testlerimde bu var:

+1

evet, haklısınız. Ayrıca olayı yalnızca $ ("ul.submenu li: includes ('Show borders') [type = checkbox]") gibi bir onay kutusu için ("click", geri arama); , Cevabınız için çok teşekkür ederim. – shuji

+0

@shuji: Ah, tamam, belirli bir nedenden dolayı 'li' üzerinde çektiğini sanıyordum. :-) –

+0

Gerçekten, bu benim menüler için onay kutusunu ilk kez kullandığım, bu yüzden doğrudan li'ye bağlamak için kullanıldı. – shuji

1

Bu davranış oluşur click olayının oluşmaz:

<label for="toggle">Show</label> 
<input id="toggle" type="checkbox" checked> 
1

Sadece bir kez tetiklenecek olan input[type="checkbox"] numaralı telefondan change olayını kullanmanızı tavsiye ederim. Yukarıdaki soruna bir çözüm yapmanız edebileceğiniz gibi Yani şu:

$("#toggle").on("change", function(e) { 
    if ($(this).is(":checked")) 
    console.log("toggle: Show"); 
    else 
    console.log("toggle: Hide"); 
}); 

https://jsfiddle.net/ssrboq3w/

IE'nin eski sürümleri ile uyumlu değildir querySelector kullanarak vanilya JS sürümü:

document.querySelector('#toggle').addEventListener('change',function(){ 
    if(this.checked) 
    console.log('toggle: Show'); 
    else 
    console.log('toggle: Hide'); 
}); 

https://jsfiddle.net/rp6vsyh6/

İlgili konular