2009-09-28 28 views
9

tôi đã nhận thấy một hành vi kỳ lạ của live() hàm trong jQuery:jQuery sống (nghe tiếng 'click') bắn cho kích chuột phải vào

<a href="#" id="normal">normal</a> 
<a href="#" id="live">live</a> 

$('#normal').click(clickHandler); 
$('#live').live('click', clickHandler); 

function clickHandler() { 
    alert("Clicked"); 
    return false; 
} 

Đó là tiền phạt và dandy cho đến khi bạn nhấp chuột phải vào các "sống" và nó sẽ kích hoạt trình xử lý và sau đó không hiển thị menu ngữ cảnh. Trình xử lý sự kiện không kích hoạt (như mong đợi) trên liên kết "bình thường".

tôi đã có thể làm việc xung quanh nó bằng cách thay đổi xử lý như sau:

function clickHandler(e) { 
    if (e.button != 0) return true; 
    // normal handler code here 
    return false; 
} 

Nhưng đó là thực sự khó chịu khi phải nói thêm rằng tất cả các xử lý sự kiện. Có cách nào tốt hơn để xử lý sự kiện chỉ kích hoạt như trình xử lý nhấp chuột thông thường không?

+1

Bạn đặt câu hỏi trong tương lai như thế nào? – PetersenDidIt

+0

Tôi rất vui khi thấy cách giải quyết của bạn ở đây và đã nhanh chóng thử ứng dụng này trên ứng dụng của riêng tôi và mặc dù các liên kết tôi đang nhấp chuột ngay bây giờ có thể bị phát hiện và bỏ qua, tôi vẫn không thấy menu ngữ cảnh nhấp chuột phải của mình những cái này Ngoài ra, nút chuột giữa của tôi (mở trong một tab mới) cũng không hoạt động. Nhưng, ít nhất người xử lý có thể trở lại sớm! – Funka

+0

Thực ra, có vẻ như nếu tôi nhấp chuột phải nhiều lần, nhanh chóng, thỉnh thoảng tôi có thể nhận được menu ngữ cảnh xuất hiện .... Hmmm. – Funka

Trả lời

9

Đó là một known issue:

Nó có vẻ như Firefox không bắn một sự kiện nhấp chuột cho các phần tử trên một nhấn chuột phải, mặc dù nó bắn một mousedown và mouseup. Tuy nhiên, nó không kích hoạt sự kiện nhấp chuột trên document! Vì .live bắt các sự kiện ở cấp tài liệu, nó thấy sự kiện nhấp cho phần tử ngay cả mặc dù chính phần tử đó không. Nếu bạn sử dụng một sự kiện như mouseup, cả hai yếu tố pdocument sẽ thấy sự kiện.

Cách giải quyết của bạn là tốt nhất bạn có thể làm ngay bây giờ. Nó dường như chỉ ảnh hưởng đến Firefox (tôi tin rằng nó thực sự là một lỗi trong Firefox, không phải jQuery mỗi lần).

Xem thêm this question được hỏi hôm qua.

0

Đây là hậu quả không may của cách thực hiện live. Nó thực sự sử dụng sự kiện bubbling để bạn không ràng buộc với sự kiện click của phần tử neo, bạn đang ràng buộc với sự kiện click của tài liệu.

+0

Không, có một lỗ hổng trong cách Firefox bong bóng nhấp chuột phải. Xem http://unixpapa.com/js/mouse.html –

+0

@crescentfresh: Tôi không chắc chắn có bao nhiêu niềm tin để đặt trong một bài báo nói rằng "phiên bản Macintosh của Safari, tất nhiên, miễn nhiễm với những vấn đề này, bởi vì Macintosh chỉ có một nút chuột "- lần cuối cùng tôi sử dụng một máy Mac với một con chuột một nút là đôi khi trước khi TBL phát minh ra Web ;-) – NickFitz

+0

@NickFitz: touché. –

4

Tôi đã tìm thấy giải pháp - "sửa" mã số live().

Trong nguồn chưa được giải mã của jQuery 1.3.2 quanh dòng 2989, có một hàm gọi là liveHandler(). Sửa đổi mã để thêm một dòng:

2989: function liveHandler(event) { 
2990:  if (event.type == 'click' && event.button != 0) return true; 

Điều này sẽ ngăn các sự kiện nhấp không kích hoạt bất cứ điều gì trừ nút chuột trái. Nếu bạn đặc biệt muốn, bạn hoàn toàn có thể dễ dàng sửa đổi mã để cho phép các sự kiện "rightclick" quá, nhưng điều này làm việc cho tôi để nó ở đó.

3

Bạn thực sự có thể viết lại nó như:

function reattachEvents(){ 
    $(element).unbind('click').click(function(){ 
     //do something 
    }); 
} 

và gọi nó khi bạn thêm một yếu tố dom mới, cần có kết quả mong đợi (không bắn trên các sự kiện click chuột phải).

+1

vâng, nhưng điều đó đánh bại mục đích của 'live() 'phải không? – nickf

+0

true, nhưng live (click) hoạt động khác với click() có thể được sửa nếu bạn phát hiện nút nào được nhấn, nhưng bạn cần biết chính xác trình duyệt nào được sử dụng (IE hoạt động khác với phiên bản cũ hơn phiên bản mới hơn) các trình duyệt khác hoạt động theo cách 'chính xác'). Đây là một giải pháp thanh lịch hơn nhiều trong thời gian này. – SeanJA

0

Tôi đã giải quyết vấn đề này bằng cách sử dụng các sự kiện được tổ chức. Trong tình huống của tôi, sự khác biệt giữa mousedown và click không quan trọng.

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