2013-10-25 38 views
11

Tại sao sự kiện nhấp chuột của tôi bị bắn hai lần trong jquery?Tại sao sự kiện nhấp chuột của tôi được gọi hai lần trong jquery?

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"); 
}); 

Đây là những gì tôi nhận được trong giao diện điều khiển:

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

Chỉ kích hoạt một lần khi tôi thử tại đây http://jsfiddle.net/LRjUc/ –

+0

@DominicGreen: Tùy thuộc vào việc bạn có nên u nhấp vào nhãn hoặc hộp kiểm (hoặc 'li'). Nếu bạn nhấp vào nhãn, thì ít nhất là trên Chrome, bạn sẽ nhận được cả hai sự kiện. –

+0

Có, hơi khó nhìn thấy nhưng nếu bạn chọn văn bản cuối cùng trên bảng điều khiển, bạn có thể thấy sự kiện được kích hoạt hai lần sau đó. – shuji

Trả lời

25

Nếu tôi nhớ không lầm, tôi đã nhìn thấy hành vi này trên ít nhất một số trình duyệt, trong đó nhấp vào labelcả hai kích hoạt nhấp chuột vào số label trên số input.

Vì vậy, nếu bạn bỏ qua các sự kiện trong đó e.target.tagName"LABEL", bạn sẽ chỉ nhận được một sự kiện. Ít nhất, đó là những gì tôi nhận được trong các bài kiểm tra của tôi:

+1

vâng, bạn nói đúng. Tôi cũng có thể kích hoạt sự kiện này chỉ cho hộp kiểm như $ ("ul.submenu li: contains ('Hiển thị đường viền') [type = checkbox]"). ("Click", gọi lại); , Cảm ơn bạn rất nhiều vì câu trả lời của bạn. – shuji

+0

@shuji: Ah, được rồi, tôi nghĩ bạn đang móc nó vào 'li' vì một lý do cụ thể. :-) –

+0

Không thực sự, nó chỉ là lần đầu tiên tôi sử dụng hộp kiểm cho các menu của tôi, vì vậy tôi đã được sử dụng để ràng buộc trực tiếp vào li. – shuji

1

Hành vi này xảy ra khi thẻ input được cấu trúc bên trong label tag:

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

Nếu hộp kiểm input được đặt bên ngoài label, với việc sử dụng các idfor các thuộc tính, nhiều bắn của sự kiện click sẽ không xảy ra:

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

Tôi khuyên bạn nên sử dụng sự kiện change trên input[type="checkbox"] sẽ chỉ được kích hoạt một lần. Vì vậy, như một giải pháp cho vấn đề trên, bạn có thể làm như sau:

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

https://jsfiddle.net/ssrboq3w/

Phiên bản vani JS sử dụng querySelector mà không tương thích với phiên bản cũ của trình duyệt IE:

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

https://jsfiddle.net/rp6vsyh6/

Các vấn đề liên quan