모든 DOM 요소에 대해 첨부 된 이벤트 핸들러 검사


107

DOM 요소의 이벤트에 첨부 된 함수 / 코드를 볼 수있는 방법이 있습니까? Firebug 또는 기타 도구 사용.


jQuery를 사용하거나 기본 DOM을 사용하여 연결 하시겠습니까?
SLaks

3
@SLaks : 좋은 질문입니다. 모든 메커니즘을 사용하여 연결
Claudio Redi

답변:


71

기존 element.onclick= handler또는 HTML을 사용하여 첨부 된 이벤트 핸들러 는 스크립트 또는 <element onclick="handler">인디 element.onclick버거 의 속성에서 간단하게 검색 할 수 있습니다 .

DOM 레벨 2 이벤트 addEventListener메소드와 IE를 사용하여 첨부 된 이벤트 핸들러 attachEvent는 현재 스크립트에서 전혀 검색 할 수 없습니다. DOM 레벨 3은 한때 element.eventListenerList모든 리스너를 얻기 위해 제안 되었지만 이것이 최종 사양에 도달할지 여부는 명확하지 않습니다. 오늘날 브라우저에는 구현이 없습니다.

브라우저 확장 기능인 디버깅 도구는 이러한 종류의 리스너에 액세스 수 있지만 실제로 수행하는 작업에 대해서는 잘 모릅니다.

일부 JS 프레임 워크는 자신이 무엇을하고 있는지 알아 내기 위해 이벤트 바인딩 기록을 충분히 남깁니다. Visual Event 는이 접근 방식을 사용하여 몇 가지 인기있는 프레임 워크를 통해 등록 된 리스너를 검색합니다.


7
이제 EventBug라는 Firebug의 확장 기능이 있으며 Chrome / safari에서도 유사한 기능이 있습니다. 나는이에 더 많은 인기를 토론에 링크를 겁니다 : stackoverflow.com/questions/446892/...
Nickolay

1
Opera에서는이를 위해 내장 된 Opera Dragonfly를 사용할 수 있습니다.
Norill Tempest

또한 HTML 태그가 선택되었을 때 이벤트를위한 FireBug (Extension for FireFox)에 내장 된 부분이 있습니다.
Musa Haidari

EventBug는 버전 2부터 FireBug에 통합되었습니다 (현재 "이벤트"탭이 있음).
크리스 레이


76

Chrome 개발자 도구Elements Panel은 2011 년 중반에 Chrome이 출시되고 2010 년부터 Chrome 개발자 채널이 출시 된 이후로이 기능이있었습니다.

또한 선택한 노드에 대해 표시되는 이벤트 리스너 는 캡처 및 버블 링 단계를 통해 실행 되는 순서대로되어 있습니다.

히트 command+ option+ i맥 OSX에와 Ctrl+ Shift+ iWindows에서 크롬이를 발사

개발 도구 스크린 샷


5
Chrome의 요소 패널은이 작업을 어떻게 수행합니까?
thunderboltz 2013 년

1
또한이를 할당하는 코드를 어떻게 찾을 수 있습니까? 나는이 UI를 사용하여 용의자 이벤트 핸들러를 찾으면 바는 ... 넓은만큼 나를 핸들러의 코드를 볼 수 있도록하지 않습니다
스티븐 루

나는이 접근 방식이 다소 혼란 스럽습니다. 적어도 저에게는. 이벤트를 열었을 때 jQuery 이벤트 만 있고 해당 특정 요소에 대한 사용자 지정 이벤트가 표시되지 않습니다. jQuery로 첨부하는 사용자 지정 이벤트에 $ ._ data를 사용합니다. stackoverflow.com/questions/2008592/…
stack247 2014-06-24

2
이벤트 window와 같은 객체 의 이벤트를 검사 할 수 message있습니까?
Septagram

8

Chrome 개발자 도구는 최근 자바 스크립트 이벤트 모니터링을 위한 몇 가지 새로운 도구를 발표했습니다 .

TL; DR

를 사용하여 특정 유형의 이벤트를 수신합니다 monitorEvents().

unmonitorEvents()듣기를 중지하는 데 사용 합니다.

를 사용하여 DOM 요소의 리스너를 가져옵니다 getEventListeners().

이벤트 리스너 검사기 패널을 사용하여 이벤트 리스너에 대한 정보를 가져옵니다.

맞춤 이벤트 찾기

제 필요에 따라 타사 코드에서 사용자 정의 JS 이벤트를 발견하면 다음 두 가지 버전 getEventListeners()이 놀랍도록 도움이되었습니다.

  • getEventListeners(window)
  • getEventListeners(document)

이벤트 리스너가 연결된 DOM 노드를 알고 있다면 window또는 대신 전달합니다 document.

알려진 이벤트

click를 들어 문서 본문 에서 모니터링하려는 이벤트를 알고있는 경우 다음을 사용할 수 있습니다 monitorEvents(document.body, 'click');..

이제 document.body콘솔에 로그인되는 모든 클릭 이벤트를보기 시작해야합니다 .


나는 thisgetEventListeners (document.getElementById ( "inputId")); 하지만 배열의 1의 크기, 무효 반환
풍부한 녹색

6

DOM을보고 직접 연결된 이벤트 (element.onclick = 핸들러)를 볼 수 있습니다. FireQuery와 함께 FireBug를 사용하여 Firefox에서 jQuery 첨부 이벤트를 볼 수 있습니다. FireBug를 사용하여 addEventListener가 추가 한 이벤트를 볼 수있는 방법이없는 것 같습니다. 그러나 Chrome 디버거를 사용하여 Chrome에서 볼 수 있습니다.


6

Allan Jardine의 Visual Event 를 사용 하여 페이지의 여러 주요 JavaScript 라이브러리에서 현재 연결된 모든 이벤트 핸들러를 검사 할 수 있습니다 . jQuery, YUI 및 기타 여러 곳에서 작동합니다.

Visual Event는 JavaScript 북마크릿이므로 모든 주요 브라우저와 호환됩니다.


1

이벤트 리스너를 추적하기 위해 자바 스크립트 환경을 확장 할 수 있습니다. 이후 추가 이벤트 리스너의 기록을 유지할 수있는 일부 코드로 네이티브 addEventListener () 메서드를 래핑 (또는 '오버로드')합니다 . 또한 HTMLElement.prototype.removeEventListener를 확장하여 DOM에서 일어나는 일을 정확하게 반영하는 레코드를 유지해야합니다.

설명을 위해 (예상되지 않은 코드)-이것은 addEventListener를 '래핑'하여 객체 자체에 등록 된 이벤트 리스너의 레코드를 포함하는 방법의 예입니다.

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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.