[javascript] 디버깅 할 때 또는 JavaScript 코드에서 DOM 노드에서 이벤트 리스너를 찾는 방법은 무엇입니까?

일부 이벤트 리스너가 입력 상자 및 선택 상자에 첨부 된 페이지가 있습니다. 어떤 이벤트 리스너가 특정 DOM 노드를 관찰하고 어떤 이벤트를 감시하는지 알 수있는 방법이 있습니까?

이벤트는 다음을 사용하여 첨부됩니다.

  1. 프로토 타입 Event.observe ;
  2. DOM addEventListener;
  3. 요소 속성으로 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. 비주얼 이벤트
  2. 요소 크롬의 개발자 도구 섹션 : (파이어 폭스에서 유사) 우측 하단의 “이벤트 리스너”에 대한 요소와 모양을 선택

코드에서 이벤트를 사용하고 버전 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 구조이므로 향후 릴리스에서 변경 될 수 있으므로 디버깅을 제외하고 는 권장하지 않습니다 . 불행히도 나는 이벤트에 액세스하는 다른 쉬운 방법이 없다는 것을 알고 있습니다.