Kiểm tra trình xử lý sự kiện đính kèm để tìm bất kỳ phần tử DOM nào


107

Có cách nào để xem những hàm / mã nào được đính kèm với bất kỳ sự kiện nào cho phần tử DOM không? Sử dụng Firebug hoặc bất kỳ công cụ nào khác.


Được đính kèm bằng jQuery hay sử dụng DOM gốc?
SLaks

3
@SLaks: Câu hỏi hay. Được đính kèm bằng cách sử dụng BẤT KỲ cơ chế nào
Claudio Redi

Câu trả lời:


71

Các trình xử lý sự kiện được đính kèm bằng cách sử dụng element.onclick= handlerHTML hoặc truyền thống <element onclick="handler">có thể được truy xuất một cách ít ỏi từelement.onclick tính từ tập lệnh hoặc trình gỡ lỗi trong.

Các trình xử lý sự kiện được đính kèm bằng cách sử dụng addEventListenercác phương thức Sự kiện DOM Mức 2 và IE attachEventhiện không thể truy xuất được từ tập lệnh. DOM Level 3 đã từng được đề xuất element.eventListenerListđể có được tất cả người nghe, nhưng không rõ liệu điều này có đưa nó đến thông số kỹ thuật cuối cùng hay không. Không có triển khai trong bất kỳ trình duyệt nào hiện nay.

Một công cụ gỡ lỗi dưới dạng tiện ích mở rộng trình duyệt có thể truy cập vào những loại trình nghe này, nhưng tôi không biết bất kỳ công cụ nào thực sự làm được điều đó.

Một số khuôn khổ JS để lại đủ hồ sơ về ràng buộc sự kiện để tìm ra những gì chúng đã làm. Visual Event sử dụng cách tiếp cận này để khám phá những người nghe đã đăng ký thông qua một số khuôn khổ phổ biến.


7
Hiện đã có một tiện ích mở rộng cho Firebug được gọi là EventBug và được báo cáo là một tính năng tương tự trong chrome / safari. Tôi cũng sẽ liên kết đến một cuộc thảo luận phổ biến hơn về vấn đề này: stackoverflow.com/questions/446892/…
Nickolay,

1
Trong Opera, bạn có thể sử dụng Opera Dragonfly tích hợp sẵn cho việc đó.
Norill Tempest 23/1213

Ngoài ra, có một phần được tích hợp sẵn cho FireBug (Phần mở rộng cho FireFox) cho các sự kiện khi thẻ HTML được chọn.
Musa Haidari

EventBug được tích hợp vào FireBug kể từ phiên bản 2 (hiện có tab "Sự kiện").
Chris Rae


76

Các yếu tố Bảng điều chỉnh trong các công cụ phát triển trên Google Chrome đã có này kể từ khi phát hành Chrome vào giữa năm 2011 và phát hành kênh nhà phát triển Chrome từ năm 2010.

Ngoài ra, các trình lắng nghe sự kiện được hiển thị cho nút đã chọn theo thứ tự mà chúng được kích hoạt qua các giai đoạn bắt giữ và tạo bọt.

Nhấn command+ option+ itrên Mac OSX và Ctrl+ Shift+ itrên Windows để kích hoạt tính năng này trong Chrome

ảnh chụp màn hình công cụ dev


5
Làm cách nào để bảng phần tử trong Chrome thực hiện điều này?
sấm sét vào

1
Ngoài ra, làm thế nào chúng ta có thể tìm thấy mã chỉ định chúng? Khi tôi tìm thấy một xử lý sự kiện nghi ngờ sử dụng giao diện người dùng này, quầy bar là không đủ rộng cho tôi để xem mã của trình xử lý ...
Steven Lu

Tôi thấy cách tiếp cận này khá khó hiểu .. ít nhất là đối với tôi. Khi tôi mở sự kiện, nó chỉ có các sự kiện jQuery, sự kiện tùy chỉnh của tôi cho phần tử cụ thể đó không hiển thị. Tôi sử dụng dữ liệu $ ._ cho các sự kiện tùy chỉnh mà tôi đính kèm với jQuery. Xem stackoverflow.com/questions/2008592/…
stack247

2
Có thể kiểm tra các sự kiện trên windowđối tượng, như messagesự kiện không?
Septagram

8

Chrome Dev Tools gần đây đã công bố một số công cụ mới để theo dõi các sự kiện JavaScript .

TL; DR

Nghe các sự kiện của một loại nhất định bằng cách sử dụng monitorEvents().

Sử dụng unmonitorEvents()để ngừng nghe.

Thu hút người nghe của phần tử DOM bằng cách sử dụng getEventListeners().

Sử dụng bảng Kiểm tra người nghe sự kiện để nhận thông tin về người nghe sự kiện.

Tìm sự kiện tùy chỉnh

Đối với nhu cầu của tôi, khám phá các sự kiện JS tùy chỉnh trong mã của bên thứ ba, hai phiên bản sau của getEventListeners()chúng hữu ích một cách đáng kinh ngạc;

  • getEventListeners(window)
  • getEventListeners(document)

Nếu bạn biết DOM Node mà trình xử lý sự kiện được gắn vào, bạn sẽ chuyển nó thay vì windowhoặc document.

Sự kiện đã biết

Nếu bạn biết sự kiện gì bạn muốn theo dõi ví dụ clicktrên cơ thể tài liệu mà bạn có thể sử dụng những điều sau đây: monitorEvents(document.body, 'click');.

Bây giờ bạn sẽ bắt đầu thấy tất cả các sự kiện nhấp chuột trên document.bodyđang được đăng nhập trong bảng điều khiển.


Tôi đã thử thisgetEventListists (document.getElementById ("inputId")); nhưng nó sẽ trả về không hợp lệ, với một kích thước mảng trong tổng số 1
màu xanh lá cây giàu

6

Bạn có thể xem các sự kiện được đính kèm trực tiếp (element.onclick = handler) bằng cách xem DOM. Bạn có thể xem các sự kiện được đính kèm jQuery trong Firefox bằng FireBug với FireQuery. Dường như không có bất kỳ cách nào để xem các sự kiện do addEventListener thêm bằng FireBug. Tuy nhiên, bạn có thể thấy chúng trong Chrome bằng trình gỡ lỗi Chrome.


6

Bạn có thể sử dụng Visual Event của Allan Jardine để kiểm tra tất cả các trình xử lý sự kiện được đính kèm hiện tại từ một số thư viện JavaScript chính trên trang của bạn. Nó hoạt động với jQuery, YUI và một số khác.

Visual Event là một bookmarklet JavaScript nên tương thích với tất cả các trình duyệt chính.


1

Bạn có thể mở rộng môi trường javascript của mình để theo dõi những người nghe sự kiện. Bao bọc (hoặc 'quá tải') phương thức addEventListener () gốc bằng một số mã có thể giữ bản ghi của bất kỳ trình nghe sự kiện nào được thêm vào từ đó trở đi . Bạn cũng sẽ phải mở rộng HTMLElement.prototype.removeEventListener để giữ các bản ghi phản ánh chính xác những gì đang xảy ra trong DOM.

Chỉ nhằm mục đích minh họa (mã chưa được kiểm tra) - đây là ví dụ về cách bạn sẽ 'bọc' addEventListener để có các bản ghi của trình nghe sự kiện đã đăng ký trên chính đối tượng:

var nativeMethod = HTMLElement.prototype.addEventListener;
HTMLElement.prototype.addEventListener = function (type, listener) {
   var el = e.currentTarget;
   if(!(el.eventListeners instanceof Array)) { el.eventListeners = []}
   el.eventListeners.push({'type':type, 'listener':listener});
   nativeMethod.call(el, type, listener);
}
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.