이벤트 핸들러가 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
'source' 카테고리의 다른 글
| 모든 파일에 대해 --ours/--theirs를 사용하여 충돌 해결 (0) | 2023.08.08 |
|---|---|
| pathVariable이 있는 URL에만 Spring Security AntMatchers 패턴을 적용하는 방법 (0) | 2023.08.08 |
| 도커 컨테이너 내부의 루트 암호 (0) | 2023.08.08 |
| 한 번에 둘 이상의 제약 조건을 삭제하는 방법(Oracle, SQL) (0) | 2023.08.08 |
| 단일 쿼리에서 합계 및 합계를 기준으로 그룹 가져오기 (0) | 2023.08.08 |