2009-07-13 48 views
22

Tôi hoàn toàn bỏ lỡ những gì điều này được cho là phải làm? Tôi hy vọng rằng nếu tôi gọi stopPropagation() trên một sự kiện, các trình xử lý cho sự kiện đó sẽ không được kích hoạt trên các phần tử tổ tiên, nhưng ví dụ bên dưới không hoạt động theo cách đó (trong ít nhất là FireFox 3) ..jquery Event.stopPropagation() dường như không hoạt động

<script type="text/javascript"> 
    $("input").live("click", function(event){ 
     console.log("input click handler called") 
     event.stopPropagation() 
    }); 

    $("body").live("click", function(event){ 
     console.log("body was click handler called. event.isPropagationStopped() returns: " + event.isPropagationStopped()); 
    }) 

</script> 

... 

<body> 
    <input type="text" > 
</body> 

Trả lời

50

Sự kiện trực tiếp không tuân thủ cùng các quy tắc về bong bóng sự kiện. Xem tài liệu trên live event handling.

Trích dẫn từ tài liệu tham khảo trên:

kiện sống không bong bóng theo cách truyền thống và không thể ngừng sử dụng stopPropagation hoặc stopImmediatePropagation. Ví dụ: lấy trường hợp của hai sự kiện nhấp chuột - một liên kết với "li" và một "li a" khác. Nếu một nhấp chuột xảy ra ở bên trong , neo CẢNH BÁO các sự kiện sẽ được kích hoạt. Điều này là bởi vì khi một $ ("li"). Bind ("click", fn); bị ràng buộc bạn thực sự đang nói "Bất cứ khi nào sự kiện nhấp chuột xảy ra trên phần tử LI - hoặc bên trong phần tử LI - kích hoạt sự kiện nhấp chuột này". Để ngừng thêm xử lý sự kiện trực tiếp, fn phải trả về false.

+0

Tuyệt vời. Cảm ơn rất nhiều về clarificatin. – morgancodes

+1

Tôi hỏi cùng một câu hỏi ở đây: http://stackoverflow.com/questions/7961418/is-it-possible-to-stop-child-click-events-propagating-to-parents-when-handled-by the điều là, những gì hiện một trong những gì làm khi bạn phải ngừng tuyên truyền về các sự kiện trực tiếp, tôi không có sự lựa chọn của loại bỏ các xử lý trực tiếp như tôi đang đối phó với các yếu tố tự động nạp. – RGBK

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