jsfiddleTại sao không thể là một sự kiện mouseup ngăn chặn một sự kiện click
<div class='wrapper'>
<button class='child'>Click me</button>
</div>
function h(e) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
alert(e.type);
return false;
}
document.querySelector('.wrapper').addEventListener('mouseup', h, false);
document.querySelector('.child').addEventListener('click', h, false);
Tôi hy vọng điều này để ngăn chặn sự kiện nghe tiếng 'click' từ bắn, nhưng nó không. Tuy nhiên, việc thay đổi mouseup
thành mousedown
thực tế sẽ ngăn sự kiện nhấp chuột.
Tôi cũng đã cố gắng đặt đối số useCapture
thành true và cũng không tạo ra hành vi mong muốn với mouseup
. Tôi đã thử nghiệm điều này trên Chrome và Firefox. Trước khi tôi phát hiện lỗi, tôi đã tìm ra ở đây.
Đây có phải là lỗi trong trình duyệt hiện tại hay là hành vi được ghi lại?
Tôi đã xem lại W3C standard (DOM level 2) và tôi không thể tìm thấy bất kỳ điều gì có thể giải thích hành vi này, nhưng tôi có thể đã bỏ lỡ điều gì đó. Trong trường hợp cụ thể của tôi, tôi đang cố tách hai đoạn mã để nghe các sự kiện trên cùng một phần tử và tôi đã sử dụng các sự kiện chụp ở phần có mức độ ưu tiên sẽ là cách thanh lịch nhất để giải quyết vấn đề này, nhưng sau đó tôi gặp phải vấn đề này. FWIW, tôi chỉ phải hỗ trợ các phiên bản chính thức được hỗ trợ của FF và Chrome (bao gồm ESR cho FF).
'preventDefault' và' stopImmediatePropagation' là không cần thiết ở đây (bằng cách này), bởi vì không có '
@Ian - tôi đã thêm những thứ đó vào để đảm bảo rằng tôi đã không ' t nhận được bình luận như "bạn đã thử x() hay y()?". Đối với bình luận khác của bạn, thiết lập 'useCapture' thành các lực lượng thực' .wrapper' của mouseup xảy ra trước khi bong bóng từ con. Tôi không bao gồm mã này, bởi vì trong cả hai trường hợp, tôi chỉ nên nhận một cảnh báo() (với một yếu tố có nguồn gốc khác), phải không? – tjameson
Nếu bạn muốn ngăn chặn một mouseclick, sử dụng này: http://jsfiddle.net/zhAHt/9/ – uSeRnAmEhAhAhAhAhA