source

이벤트 핸들러가 jQuery의 요소에 바인딩되어 있는지 테스트

bestscript 2023. 8. 8. 23:41

이벤트 핸들러가 jQuery의 요소에 바인딩되어 있는지 테스트

요소에 클릭 핸들러, 변경 핸들러 또는 jQuery를 사용하여 바인딩된 이벤트 핸들러가 있는지 확인할 수 있습니까?

또한 주어진 이벤트 유형에 대해 몇 개의 클릭 핸들러(또는 어떤 종류의 이벤트 핸들러)가 있고 이벤트 핸들러에 어떤 기능이 있는지 확인할 수 있습니까?

데이터 캐시에서 이 정보를 가져올 수 있습니다.

예를 들어 콘솔(파이어버그, 즉 8)에 기록합니다.

console.dir( $('#someElementId').data('events') );

또는 반복합니다.

jQuery.each($('#someElementId').data('events'), function(i, event){

    jQuery.each(event, function(i, handler){

        console.log( handler.toString() );

    });

});

다른 방법으로는 다음 북마크릿을 사용할 수 있지만 런타임에는 도움이 되지 않습니다.

바인딩이 아직 존재하지 않을 때 바인딩을 제거하는 것은 최선의 해결책은 아니지만 충분히 효과적인 것 같습니다!두 번째로 '클릭'하면 중복 바인딩이 생성되지 않는다는 것을 확실히 알 수 있습니다.

따라서 다음과 같이 die() 또는 unbind()를 사용합니다.

$("#someid").die("click").live("click",function(){...

또는

$("#someid").unbind("click").bind("click",function(){...

또는 최신 jQuery 버전:

$("#someid").off("click").on("click",function(){...

저는 hasEventListener라는 플러그인을 작성했는데, 이 플러그인은 정확히 다음과 같습니다.

http://github.com/sebastien-p/jquery.hasEventListener

이게 도움이 되길 바랍니다.

블로그에서 확인할 수 있듯이 jQuery 1.8 이후 이 솔루션은 더 이상 지원되지 않습니다.

$(으).datastore":이제 1.8에서 제거되었지만 $._data(element, "events")를 통해 디버깅 목적으로 이벤트 데이터에 액세스할 수 있습니다.지원되는 공용 인터페이스가 아닙니다. 실제 데이터 구조는 버전마다 호환되지 않게 변경될 수 있습니다.

따라서 바인딩을 해제/재바인딩하거나 부울을 사용하여 이벤트가 연결되었는지 여부를 확인해야 합니다(제 생각에는 가장 좋은 해결책).

jQuery 1.9로 업데이트되었을 수 있습니다.*

저는 지금 이것이 저에게 유일하게 효과가 있다는 것을 발견하고 있습니다.

$._data($("#yourElementID")[0]).events

저는 "원스"라는 아주 작은 플러그인을 썼습니다. 이 플러그인은 다음과 같습니다.

$.fn.once = function(a, b) {
    return this.each(function() {
        $(this).off(a).on(a,b);
    });
};

간단히 말해,

$(element).once('click', function(){
});

jQuery 1.9+의 경우

var eventListeners = $._data($('.classname')[0], "events");

나는 필요했습니다.[0]배열 리터럴.

언급된 hasEventListener 플러그인이 사용자 지정 이벤트를 처리할 것이라고 생각하지 않습니다.

var obj = {id:'test'};
$(obj).bind('custom', function(){
    alert('custom');
}).trigger('custom');

alert($(obj).hasEventListener('custom'));

또한 적어도 jQuery 1.5에서는 위와 같이 객체에 바인딩된 이벤트에 대해 $(target).data('events')를 다르게 반환하므로 주의가 필요하다고 생각합니다.

다음과 같은 작업을 수행해야 합니다.

var events = $(target).data("events");
if(typeof events === "function"){
   events = events.events;
}

저는 이런 종류의 접근법을 사용하고 있고 그것은 효과가 있지만 제가 jquery 내부자들의 손에 달려있는 것처럼 느껴지고 정말로 그것을 해서는 안 됩니다!

저는 다음과 같은 작업을 수행할 수 있도록 기존 코드를 신속하게 패치는 다음과 같은 작업을 수행할 수 있습니다.

 if( $('.scroll').hasHandlers('mouseout') )  // could be click, or '*'...
 { 
   ... code ..
 }

이벤트 위임에도 사용할 수 있습니다.

 if ( $('#main').hasHandlers('click','.simple-search') )  ...

jquery-handler-toolkit.js는 여기에서 사용할 수 있습니다.

SJG의 답변 W3Schools.com 의 답변을 참조합니다.

jQuery 버전 1.7에서 off() 메서드는 unbind(), die() 및 undelegate() 메서드를 새로 대체한 것입니다.이 방법은 API에 많은 일관성을 제공하며, jQuery 코드 기반을 단순화하므로 이 방법을 사용하는 것이 좋습니다.

이것은 다음을 제공합니다.

$("#someid").off("click").live("click",function(){...

또는

$("#someid").off("click").bind("click",function(){...

이것은 나에게 효과가 있습니다: $('#profile1').attr('onclick')

언급URL : https://stackoverflow.com/questions/1236067/test-if-event-handler-is-bound-to-an-element-in-jquery