일부 이벤트 리스너가 입력 상자 및 선택 상자에 첨부 된 페이지가 있습니다. 어떤 이벤트 리스너가 특정 DOM 노드를 관찰하고 어떤 이벤트를 감시하는지 알 수있는 방법이 있습니까?
이벤트는 다음을 사용하여 첨부됩니다.
- 프로토 타입
Event.observe
; - DOM
addEventListener
; - 요소 속성으로
element.onclick
.
답변
페이지에서 무슨 일이 일어나고 있는지 검사해야하는 경우 시각적 이벤트 책갈피를 사용해보십시오 .
업데이트 : Visual Event 2를 사용할 수 있습니다.
답변
이벤트가 첨부되는 방법에 따라 다릅니다. 설명을 위해 다음과 같은 클릭 핸들러가 있습니다.
var handler = function() { alert('clicked!') };
우리는 다른 방법을 사용하여 요소에 첨부 할 것입니다. 일부는 검사를 허용하고 일부는 허용하지 않습니다.
방법 A) 단일 이벤트 핸들러
element.onclick = handler;
// inspect
alert(element.onclick); // alerts "function() { alert('clicked!') }"
방법 B) 다중 이벤트 핸들러
if(element.addEventListener) { // DOM standard
element.addEventListener('click', handler, false)
} else if(element.attachEvent) { // IE
element.attachEvent('onclick', handler)
}
// cannot inspect element to find handlers
방법 C) : jQuery
$(element).click(handler);
-
1.3.x
// inspect var clickEvents = $(element).data("events").click; jQuery.each(clickEvents, function(key, value) { alert(value) // alerts "function() { alert('clicked!') }" })
-
1.4.x (핸들러를 객체 안에 저장)
// inspect var clickEvents = $(element).data("events").click; jQuery.each(clickEvents, function(key, handlerObj) { alert(handlerObj.handler) // alerts "function() { alert('clicked!') }" // also available: handlerObj.type, handlerObj.namespace })
( jQuery.fn.data
와 참조 jQuery.data
)
방법 D) : 프로토 타입 (지저분한)
$(element).observe('click', handler);
-
1.5.x
// inspect Event.observers.each(function(item) { if(item[0] == element) { alert(item[2]) // alerts "function() { alert('clicked!') }" } })
-
1.6에서 1.6.0.3 (포함) (매우 어려움)
// inspect. "_eventId" is for < 1.6.0.3 while // "_prototypeEventID" was introduced in 1.6.0.3 var clickEvents = Event.cache[element._eventId || (element._prototypeEventID || [])[0]].click; clickEvents.each(function(wrapper){ alert(wrapper.handler) // alerts "function() { alert('clicked!') }" })
-
1.6.1 (약간 양호)
// inspect var clickEvents = element.getStorage().get('prototype_event_registry').get('click'); clickEvents.each(function(wrapper){ alert(wrapper.handler) // alerts "function() { alert('clicked!') }" })
답변
getEventListeners(domElement)
개발자 도구 콘솔에서 Chrome, Firefox, Vivaldi 및 Safari가 지원 됩니다.
대부분의 디버깅 목적으로이를 사용할 수 있습니다.
https://developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners 는 다음과 같이 사용하면 좋습니다.
답변
Chrome 또는 Safari 브라우저의 WebKit Inspector가 이제이 작업을 수행합니다. 요소 창에서 DOM 요소를 선택하면 DOM 요소의 이벤트 리스너가 표시됩니다.
답변
모든 이벤트 리스너 를 JavaScript 로 나열 할 수 있습니다 . 그렇게 어렵지는 않습니다. 리스너 를 추가 하기 전에prototype
HTML 요소의 메소드 를 해킹하면 됩니다.
function reportIn(e){
var a = this.lastListenerInfo[this.lastListenerInfo.length-1];
console.log(a)
}
HTMLAnchorElement.prototype.realAddEventListener = HTMLAnchorElement.prototype.addEventListener;
HTMLAnchorElement.prototype.addEventListener = function(a,b,c){
this.realAddEventListener(a,reportIn,c);
this.realAddEventListener(a,b,c);
if(!this.lastListenerInfo){ this.lastListenerInfo = new Array()};
this.lastListenerInfo.push({a : a, b : b , c : c});
};
이제 모든 앵커 요소 ( a
) lastListenerInfo
에는 모든 리스너가 포함 된 속성 이 있습니다 . 또한 익명 함수로 리스너를 제거하는 데에도 효과적입니다.
답변
Chrome 에서 getEventListeners 사용 :
getEventListeners(document.getElementByID('btnlogin'));
getEventListeners($('#btnlogin'));
답변
( 이 질문 과 관련 이 있으므로 여기 에서 답변을 다시 작성 하십시오.)
디버깅 할 때 이벤트를보고 싶다면 다음 중 하나를 권장합니다 …
- 비주얼 이벤트
- 요소 크롬의 개발자 도구 섹션 : (파이어 폭스에서 유사) 우측 하단의 “이벤트 리스너”에 대한 요소와 모양을 선택
코드에서 이벤트를 사용하고 버전 1.8 이전의 jQuery를 사용하는 경우 다음을 사용할 수 있습니다.
$(selector).data("events")
이벤트를 얻을 수 있습니다. 버전 1.8부터 .data ( “events”) 사용이 중단되었습니다 ( 이 버그 티켓 참조 ). 당신이 사용할 수있는:
$._data(element, "events")
다른 예 : 콘솔에 대한 특정 링크의 모든 클릭 이벤트를 작성하십시오.
var $myLink = $('a.myClass');
console.log($._data($myLink[0], "events").click);
( 작동 예는 http://jsfiddle.net/HmsQC/ 참조 )
불행히도 $ ._ data를 사용 하면 내부 jQuery 구조이므로 향후 릴리스에서 변경 될 수 있으므로 디버깅을 제외하고 는 권장하지 않습니다 . 불행히도 나는 이벤트에 액세스하는 다른 쉬운 방법이 없다는 것을 알고 있습니다.
![](http://daplus.net/wp-content/uploads/2023/04/coupang_part-e1630022808943-2.png)