2011-09-16 29 views
7

Khi tôi sử dụng. Liên kết để ràng buộc sự kiện trên con và cha mẹ, sự kiện con có thể ngăn chặn sự kiện propogation với trả về false; Nhưng khi tôi sử dụng đại biểu, trả về false; không dừng tuyên truyền sự kiện.Làm thế nào để ngăn chặn sự kiện tuyên truyền khi sử dụng đại biểu?

http://jsfiddle.net/J3EAQ/

html:

<div class="parent"> 
    <div class="child"></div> 
    <div class="child"></div> 
</div> 

js:

$('.parent').delegate('.child','click',function(e){ 
    alert('child click'); 
    return false; 
}); 
$('.parent').bind('click',function(e){ 
    alert('parent click'); 
}); 
+0

Có thể trùng lặp? http://stackoverflow.com/questions/1357118/javascript-event-preventdefault-vs-return-false –

Trả lời

8

e.stopPropagation() sẽ không hoạt động trong trường hợp này. Sử dụng e.stopImmediatePropagation() để thay thế. Đây là một số fiddle

+0

Có, đó là giải pháp tôi đang tìm kiếm. Cảm ơn! – codez

1

Bạn nên sử dụng e.stopPropagation() để ngăn chặn sự lan truyền, không phải bằng cách trả lại sai.

return false về mặt kỹ thuật là hai điều; 1) ngăn chặn các hành động mặc định, và 2) dừng tuyên truyền. Thử chuyển sang lời gọi phương thức trên e và xem điều đó có khắc phục được sự cố của bạn hay không.

+0

Vẫn không giải quyết được sự cố này –

+0

@Interstellar_Coder - Đúng vậy, giải pháp của bạn tốt hơn. Không bao giờ biết về 'stopImmediatePropagation()'. Cảm ơn! – Tejs

4

Tại sao hai bộ xử lý nhấp chuột khi bạn có thể có một:

$('.parent').click(function (e) { 
    if ($(e.target).is('.child')) { 
     alert('child click'); 
    } else { 
     alert('parent click'); 
    }  
}); 

Live Demo:http://jsfiddle.net/J3EAQ/2/


Một tổng quát của mô hình này:

$(element).click(function (e) { 
    if (e.target === this) { 
     // this element was clicked directly 
    } else { 
     // this element was NOT clicked directly 
     // a descendant of this element was clicked 
    }  
}); 

Trình xử lý riêng biệt?

$('.parent').click(function (e) { 
    if (this ==== e.target) { 
     parentClicked.call(e.target, e); 
    } else { 
     childClicked.call(e.target, e); 
    }  
}); 

function childClicked(e) { 
    // child click handler 
} 

function parentClicked(e) { 
    // parent click handler 
} 
+0

về mặt kỹ thuật nó giải quyết được vấn đề, nhưng tôi muốn tách biệt chức năng của các phần tử khác nhau, vì vậy tôi cần một giải pháp với 2 trình xử lý sự kiện. – codez

+0

Sau đó, không sử dụng '.delegate', chỉ cần sử dụng' .click' ở cả hai vị trí. – Blazemonger

+0

@codez Bạn cũng có thể có điều đó. Xem cập nhật của tôi. –

0

Bạn luôn có thể sử dụng e.stopPropagation()

+0

Không hoạt động: http://jsfiddle.net/J3EAQ/3/ – codez

-1

sự kiện của bạn không được phổ biến. bạn đang ràng buộc trình xử lý nhấp chuột vào .parent và bạn đang nhấp vào .parent

0

Điều gì làm việc cho tôi là kiểm tra tên lớp của mục tiêu nhấp chuột trong trình xử lý nhấp chuột mà bạn không muốn bị kích hoạt bởi sự kiện nhấp chuột khác. Một cái gì đó như thế này.

if(e.target.className.toString().indexOf("product-row") > -1){ 
     // Only do stuff if the correct element was clicked 
    } 
Các vấn đề liên quan