2013-08-20 82 views
10

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).

+0

'preventDefault' và' stopImmediatePropagation' là không cần thiết ở đây (bằng cách này), bởi vì không có '

' nên không gửi nút và không có nhiều sự kiện cùng loại. Và tôi nghĩ * đây là hành vi mong đợi bởi vì không có 'mouseup' bắn trước' click'? Vì vậy, sự kiện 'mouseup' của' .ild' sẽ kích hoạt (và bong bóng) trước sự kiện 'click' (mà bạn đã dừng lại, nhưng nó không quan trọng) – Ian

+0

@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

+0

Nếu bạn muốn ngăn chặn một mouseclick, sử dụng này: http://jsfiddle.net/zhAHt/9/ – uSeRnAmEhAhAhAhAhA

Trả lời

0

Check out this quirksmode article

Các click sự kiện:

cháy khi một mousedown và MouseUp sự kiện xảy ra trên cùng một nguyên tố.

Vì vậy, khi click chuột được phát hành, cả mouseupclick sự kiện được bắn, click không chờ cho mouseup gọi lại để kết thúc. Hầu như luôn luôn, mouseupclick có thể được sử dụng đồng nghĩa.

Để hủy click, như bạn chứng minh, bạn có thể trở false trong callback mousedown sự kiện, giúp ngăn chặn sự kiện click từ bao giờ hoàn thành.

+5

Không chính xác, trả về false, o event.preventPropagation sẽ ngừng mouseup nhưng không có sự kiện nhấp chuột. – eveevans