2010-07-18 42 views
23

cách Noob để làm điều đó tôi đoán sẽ làbắt bất kỳ nhấp chuột thực hiện bằng jQuery

$('*').click(function(){...}); 

Nhưng có cách nào tôi có thể bắt bất kỳ loại nhấp chuột, mà không cần phải đăng ký một người biết lắng nghe cho mọi đối tượng trong DOM?


Trợ giúp sẽ thật tuyệt vời. =)

Trả lời

29

Một sự kiện click sẽ theo mặc định bubble up the DOM, vì vậy bạn có thể chỉ cần đính kèm một handler click vào thư mục gốc, như thế này:

$(document).click(function() { 
    //do something 
}); 

Trừ một handler trên một phần tử trên đường đi làm một event.stopPropagation() hoặc return false , bạn sẽ nhận được bấm vào đây.

+2

+1, vừa viết bài này. Điều này giả định rằng không có trình xử lý nhấp chuột nào khác hủy bỏ bong bóng bằng cách sử dụng 'event.stopPropagation()', tất nhiên. –

+0

Cảm ơn bạn Nick !! – RadiantHex

+0

Sự kiện.stopPropagation() rất hữu ích để biết! Cảm ơn bạn đã bao gồm điều này – RadiantHex

2

Làm thế nào về:

$('body').click(function(){...}); 

Bất kỳ nhấp chuột sẽ được trên cơ thể, vì đó là mẹ của tất cả các nút có thể nhìn thấy trong các dom.

3

Làm cách nào chỉ việc đính kèm một lần nhấp vào cơ thể?

$('body').click(function(e){ ... }) 

Các e.target nên chứa những gì được nhấp vào

16

Bạn có thể sử dụng đoàn sự kiện trên tài liệu để bắt tất cả các nhấp chuột.

jQuery sẽ điền vào thuộc tính target của event để truy xuất phần tử được nhấp.

$(document).click(function(event){ 
    // event.target is the clicked object 
}); 

Lưu ý rằng event.target sẽ là yếu tố sâu xa nhấp vào. Ví dụ: nếu có <span> trong một số <a>, bạn sẽ nhận được <span>, không phải là <a>.

Nếu bạn muốn bắt bất kỳ nhấp chuột nhưng muốn lấy một yếu tố cụ thể (như một lớp), bạn có thể làm:

$(document).click(function(event){ 
    $(event.target).closest(".clickable").each(function(){ 
    // "this" is your "clickable" clicked 
    }); 
}); 

Trừ khi một event handler trên một phần tử trên đường đi làm một event.stopPropagation() hoặc return false , bạn sẽ nhận được bấm vào đây.

+0

Cảm ơn đây là một câu trả lời tuyệt vời, cảm ơn bạn đã bao gồm thông tin không cần thiết nhưng rất hữu ích! Nếu bạn cũng có thể thêm sự kiện "event.stopPropagation()", tôi rất sẵn lòng đánh dấu câu trả lời này = D – RadiantHex

+2

Tôi tin rằng '.recent() 'sẽ chỉ trả về một đối tượng cha, vì vậy việc sử dụng' .each() 'sẽ không cần thiết. – Mottie

+1

@fudgey - Điều đó phụ thuộc vào cách sử dụng, ví dụ '$ (this) .plugin ({option: this.id});' không thể bị xâu chuỗi ('this' sẽ là phần tử sai), nhưng sống bên trong '.each()' đóng cửa độc đáo. –

4

$('*').click(function() {...}) sẽ chỉ bắt các nhấp chuột vào các yếu tố đã tồn tại khi bạn thực hiện cuộc gọi đến .click(). Để nắm bắt các nhấp chuột vào các yếu tố có thể được tạo sau này, bạn cần phải liên kết với body hoặc document như những yếu tố khác đã đề xuất.

+1

Cảm ơn vì phần kiến ​​thức bổ sung này, rất có giá trị. – RadiantHex

+0

Lưu ý rằng điều này sẽ ràng buộc trình xử lý sự kiện nhấp chuột trên mọi phần tử trong DOM của bạn sẽ tiêu thụ nhiều bộ nhớ hơn và sẽ yêu cầu nhiều CPU hơn khi trang đang chạy. –

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