2011-08-17 41 views
11

Tôi liên kết với một liên kết (bằng cách sử dụng hàm .live() của jQuery) click sự kiện và sau đó thêm một trình xử lý sự kiện onclick với JS và HTML thuần túy (như <a href="".... onclick="some action">). Tôi muốn ngăn chặn sự sủi bọt của sự kiện theo phương pháp live nhưng tôi không biết làm thế nào.stopPropagation mà không cần jQuery

Có lẽ e.stopPropagation() hữu ích trong trường hợp này nhưng trình xử lý sự kiện được thêm bằng onclick được viết bằng JS thuần túy và tôi không thể gọi stopPropagation() từ bên ngoài trình bao bọc phần tử jQuery. return false trong trường hợp này không hoạt động. Tôi đã cố gắng thay thế return false bằng $.Event('click').stopPropagation() nhưng tôi nghĩ rằng điều này là sai vì nó không hoạt động.

Làm thế nào để ngăn chặn bong bóng đến phương pháp live() không có trình bao bọc jQuery?

Trả lời

2

Với .live, bạn không thể ngừng tuyên truyền. Điều này là do với .live, trình xử lý sự kiện được liên kết với gốc của cây DOM. Do đó các sự kiện phải bong bóng tối đa các yếu tố cao nhất trước khi xử lý của bạn có thể được gọi. Đó là một trong những hãy cẩn thận khi sử dụng .live.

Cân nhắc sử dụng .delegate (nếu bạn muốn trình xử lý tồn tại) hoặc sử dụng .bind thay thế.

Nếu bạn muốn xử lý trực tiếp bị vô hiệu hoàn toàn, sử dụng die:

$("#myHref").die("click", aClick); // this will remove any existing event handlers 
$("#myHref").click(yourhandler); // add your handler 

Demo 1: JsFiddle 1

Hoặc, thêm một handler inline (và hủy bỏ sự kiện này từ đó):

<a href=".." onclick="yourhandler"> 

Demo 2: JsFiddle 2

Trình xử lý nội tuyến sẽ b e được gọi trước tiên trước bất kỳ trình xử lý sự kiện jquery nào.

+0

Tôi không thể thay đổi mã ràng buộc bởi .live. Không có cách nào để sửa lỗi này? – abonec

+0

Nhưng có thể dừng sự kiện từ một trình xử lý sự kiện khác được ràng buộc với phần tử đó. –

+0

Chỉ khi trình xử lý sự kiện đó được đăng ký trước. jQuery sẽ xếp hàng chúng lên, phải không? – Mrchief

13

Tôi đã giả định rằng return false trong trình xử lý sự kiện "bình thường" cũng ngăn không cho sự kiện đó phát ra, but I was wrong (nhờ @Mrchief).

Có nhiều cách khác để ngăn chặn nó mặc dù, như mô tả ở trên quirksmode.org:

function doSomething(e) 
{ 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 

cancelBubble là dành cho IE, stopPropagation công trình trong tất cả các trình duyệt tương thích W3C.

+0

Thậm chí tôi đã học được rằng một vài tuần trở lại! – Mrchief

+0

Khi tôi cố gắng nhận được bất kỳ thông tin nào về sự kiện (onclick "alert (window.event)"), nó hiển thị cho tôi cảnh báo "undefined" khi tôi nhấp vào. – abonec

+1

@Abonec: 'window.event' chỉ khả dụng trong IE (và Chrome). Trong các trình duyệt khác, đối tượng sự kiện được chuyển tới trình xử lý sự kiện làm tham số. –

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