Tôi có thể tìm các sự kiện bị ràng buộc trên một phần tử với jQuery không?


355

Tôi liên kết hai trình xử lý sự kiện trên liên kết này:

<a href='#' id='elm'>Show Alert</a>

JavaScript:

$(function()
{
  $('#elm').click(_f);
  $('#elm').mouseover(_m);
});

function _f(){alert('clicked');}
function _m(){alert('mouse over');}

Có cách nào để có được danh sách tất cả các sự kiện bị ràng buộc trên một phần tử, trong trường hợp này là phần tử với id="elm"?

Câu trả lời:


517

Trong các phiên bản hiện đại của jQuery, bạn sẽ sử dụng $._dataphương thức để tìm bất kỳ sự kiện nào được jQuery đính kèm với phần tử được đề cập. Lưu ý , đây là phương pháp chỉ sử dụng nội bộ:

// Bind up a couple of event handlers
$("#foo").on({
    click: function(){ alert("Hello") },
    mouseout: function(){ alert("World") }
});

// Lookup events for this particular Element
$._data( $("#foo")[0], "events" );

Kết quả từ $._datasẽ là một đối tượng chứa cả hai sự kiện chúng ta đặt (hình dưới đây với thuộc mouseouttính được mở rộng):

Bảng điều khiển đầu ra cho $ ._

Sau đó, trong Chrome, bạn có thể nhấp chuột phải vào chức năng xử lý và nhấp vào "xem định nghĩa chức năng" để hiển thị cho bạn vị trí chính xác nơi nó được xác định trong mã của bạn.


59
Điều này chỉ hoạt động cho các phần tử bị ràng buộc thông qua các trình trợ giúp jQuery.
Alex Ciminian

3
@jammypeach Tôi đang thử giải pháp của bạn nhưng vẫn không xác định được trả về cho bộ chọn. Tôi đã sử dụng $ ('# elem'). Bind ('click', function () {}); nếu điều đó sẽ làm cho một sự khác biệt.
Marcus

6
@marcus ahhh, woops Tôi đã bỏ lỡ điều gì đó, xin lỗi :)$._data(element[0], ‘events’);
hoàn toàn không phải là

16
Ngày nay, người ta phải sử dụng: $ ._ data ($ ('# foo') [0]) .events
Donald Taylor

5
$._data()được sử dụng bởi JQuery nội bộ. $.data()là phương thức công khai cho người dùng. Và $.data(element, 'events')hoạt động tốt.
slideshowp2

73

Trường hợp chung:

  • Nhấn F12để mở Dev Tools
  • Nhấp vào Sourcestab
  • Ở phía bên tay phải, cuộn xuống Event Listener Breakpointsvà mở rộng cây
  • Bấm vào các sự kiện bạn muốn nghe.
  • Tương tác với phần tử đích, nếu chúng bắn bạn sẽ nhận được điểm dừng trong trình gỡ lỗi

Tương tự, bạn có thể:

  • nhấp chuột phải vào phần tử đích -> chọn " Inspect element"
  • Cuộn xuống phía bên phải của khung dev, ở dưới cùng là ' event listeners'.
  • Mở rộng cây để xem những sự kiện nào được gắn vào phần tử. Không chắc chắn nếu điều này hoạt động cho các sự kiện được xử lý thông qua bong bóng (tôi đoán là không)

3
Tôi đồng ý đây là phương pháp ưa thích và là một giải pháp phổ quát, so với việc dựa vào jQuery, có thể có hoặc không có sẵn.
deadbabykitten

3
@dead umm ... câu hỏi đề cập cụ thể đến jQuery và sử dụng jQuery trong tệp đính kèm ví dụ - câu trả lời chỉ nên có giá trị trong ngữ cảnh của jQuery (?)
Code

3
Thật hữu ích để hiểu câu trả lời trong các bối cảnh khác là tốt. Chỉ vì ai đó hỏi một câu hỏi cụ thể không có nghĩa là câu trả lời bị ràng buộc mà họ sẽ nhận được là câu trả lời hay nhất. Đặc biệt với jQuery, mọi người có xu hướng dựa vào nó như một cái nạng. Hiểu kiến ​​trúc cơ bản là quan trọng. Câu trả lời này cho thấy jQuery thậm chí không nhất thiết phải có. Câu hỏi và ví dụ quá mơ hồ để biết cách sử dụng và do đó, bỏ ngỏ để giải thích những gì có thể được coi là một câu trả lời hợp lệ.
deadbabykitten 28/03/2016

12

Tôi đang thêm điều này cho hậu thế; Có một cách dễ dàng hơn mà không liên quan đến việc viết thêm JS. Sử dụng addon firebird tuyệt vời cho firefox ,

  1. Nhấp chuột phải vào phần tử và chọn 'Kiểm tra phần tử bằng Fireorms'
  2. Trong bảng điều khiển bên (hiển thị trong ảnh chụp màn hình), điều hướng đến tab sự kiện bằng cách sử dụng mũi tên> nhỏ
  3. Tab sự kiện hiển thị các sự kiện và chức năng tương ứng cho từng sự kiện
  4. Văn bản bên cạnh nó hiển thị vị trí chức năng

nhập mô tả hình ảnh ở đây


1
Điều này cũng có sẵn trong các công cụ phát triển IE.
devlin cẩm chướng

9

Bây giờ bạn có thể chỉ cần lấy một danh sách các trình lắng nghe sự kiện được liên kết với một đối tượng bằng cách sử dụng hàm javascript getEventListener ().

Ví dụ: nhập nội dung sau trong bảng điều khiển công cụ dev:

// Get all event listners bound to the document object
getEventListeners(document);

4
Tôi nghĩ rằng đó không phải là một hàm riêng và cần tập lệnh / phụ thuộc sau: github.com/colxi/getEventListener Điều này nên được thêm vào câu trả lời, vì nó gây hiểu lầm khác. Nhưng cảm ơn vì đã đưa tôi đến 'plugin' đó; có vẻ tốt đẹp. :)
Dennis98 18/03/19

6

Các jQuery Audit Plugin Plugin sẽ cho phép bạn thực hiện điều này thông qua Chrome Dev cụ bình thường. Nó không hoàn hảo, nhưng nó sẽ cho phép bạn thấy trình xử lý thực tế bị ràng buộc với phần tử / sự kiện chứ không chỉ là trình xử lý jQuery chung.


3

Mặc dù điều này không chính xác cụ thể đối với các bộ chọn / đối tượng jQuery, nhưng trong FireFox Quantum 58.x, bạn có thể tìm thấy các trình xử lý sự kiện trên một phần tử bằng các công cụ Dev:

  1. Nhấp chuột phải vào phần tử
  2. Trong menu ngữ cảnh, nhấp vào 'Kiểm tra phần tử'
  3. Nếu có biểu tượng 'ev' bên cạnh phần tử (hộp màu vàng), hãy nhấp vào biểu tượng 'ev'
  4. Hiển thị tất cả các sự kiện cho phần tử đó và xử lý sự kiện

Công cụ Dev lượng tử FF


1
câu trả lời tuyệt vời, đặc biệt là ảnh chụp màn hình làm cho nó dễ dàng hơn nhiều. Cảm ơn vì nỗ lực của bạn!
bizi

2

Tôi đã sử dụng một cái gì đó như thế này nếu ($ ._ data ($ ("a.wine-item-link") [0]). Events == null) {... làm một cái gì đó, khá nhiều ràng buộc trình xử lý sự kiện của họ một lần nữa} để kiểm tra nếu yếu tố của tôi bị ràng buộc với bất kỳ sự kiện. Nó vẫn sẽ nói không xác định (null) nếu bạn đã hủy liên kết tất cả các trình xử lý sự kiện của bạn từ phần tử đó. Đó là lý do tại sao tôi đánh giá điều này trong một biểu thức if.


2

Lưu ý rằng các sự kiện có thể được đính kèm vào chính tài liệu chứ không phải là yếu tố được đề cập. Trong trường hợp đó, bạn sẽ muốn sử dụng:

$._data( $(document)[0], "events" );

Và tìm sự kiện với bộ chọn chính xác :

nhập mô tả hình ảnh ở đây

Và sau đó nhìn vào trình xử lý > [[FunctionLocation]]

nhập mô tả hình ảnh ở đây


0

Khi tôi chuyển một truy vấn DOM phức tạp nhỏ đến dữ liệu $ ._ như thế này: $._data($('#outerWrap .innerWrap ul li:last a'), 'events')nó sẽ ném không xác định trong bảng điều khiển trình duyệt.

Vì vậy, tôi đã phải sử dụng dữ liệu $ ._ trên div cha: $._data($('#outerWrap')[0], 'events')để xem các sự kiện cho các thẻ. Đây là một JSFiddle cho cùng: http://jsfiddle.net/giri_jeedigunta/MLcpT/4/


3
Lý do cho điều này là bạn đang ủy thác sự kiện từ $('#outerWrap'). Các sự kiện thực sự bị ràng buộc với yếu tố đó chứ không phải là các neo riêng lẻ.
Scottux
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.