jQuery에서 이벤트 핸들러를 제거하는 가장 좋은 방법은 무엇입니까?


1053

있습니다 input type="image". 이것은 Microsoft Excel의 셀 노트처럼 작동합니다. 누군가 가이 텍스트 상자에 숫자를 입력하면에 input-image대한 이벤트 핸들러를 설정합니다 input-image. 그런 다음 사용자가를 클릭 image하면 데이터에 메모를 추가 할 수있는 팝업이 나타납니다.

내 문제는 사용자가 텍스트 상자에 0을 입력하면 input-image의 이벤트 핸들러 를 비활성화해야한다는 것 입니다. 나는 다음을 시도했지만 아무 소용이 없다.

$('#myimage').click(function { return false; });

답변:


1626

jQuery ≥ 1.7

jQuery를 이후 이벤트 API가 업데이트 1.7로, .bind()/ .unbind()여전히 이전 버전과의 호환성을 위해 사용할 수 있지만 선호하는 방법은을 사용 ) (에 / () 오프 기능. 아래는 이제

$('#myimage').click(function() { return false; }); // Adds another click event
$('#myimage').off('click');
$('#myimage').on('click.mynamespace', function() { /* Do stuff */ });
$('#myimage').off('click.mynamespace');

jQuery <1.7

예제 코드에서는 이전 클릭을 재정의하지 않고 이미지에 다른 클릭 이벤트를 추가하기 만하면됩니다.

$('#myimage').click(function() { return false; }); // Adds another click event

그런 다음 두 클릭 이벤트가 모두 시작됩니다.

사람들이 말했듯이 unbind를 사용하여 모든 클릭 이벤트를 제거 할 수 있습니다.

$('#myimage').unbind('click');

단일 이벤트를 추가 한 다음 추가했을 수있는 다른 이벤트를 제거하지 않고 이벤트를 제거하려는 경우 이벤트 이름 간격을 사용할 수 있습니다.

$('#myimage').bind('click.mynamespace', function() { /* Do stuff */ });

이벤트 만 제거하려면 :

$('#myimage').unbind('click.mynamespace');

6
unbind()작동하는지 테스트하는 방법 이 있습니까? 나는 그것을 추가했고 두 이벤트는 여전히 실행 중입니다.
David Yell

19
두 이벤트가 여전히 실행 중이면 분명히 작동하지 않습니다. 정답을 얻으려면 더 많은 정보를 제공해야합니다. 별도의 질문을하십시오.
samjudson

13
이전 답변-포함 된 네임 스페이스 정보와 비슷하지만 잊어 버립니다. on / off가 jQ 객체를 반환합니까? 그렇다면 데이지 체인을 사용하는 것이 더 완전한 대답 일 것입니다.$('#myimage').off('click').on('click',function(){...})
vol7ron

3
예, 그렇습니다. 다른 모든 클릭 이벤트를 지우고 직접 추가하려는 경우 위의 연결 통화를 수행 할 수 있습니다.
samjudson

를 사용하면 .unbind()많은 확인란을 토글하는 상황에서 도움이되었지만 .click()처리기를 반복적 으로 다시 추가 하여 앱이 중단 되는 상황에서 도움이되었습니다 .
TecBrat

63

이 질문에 대한 답변이 제공되지 않았지만 live () 메서드를 사용하여 이벤트를 활성화 / 비활성화 할 수도 있습니다 .

$('#myimage:not(.disabled)').live('click', myclickevent);

$('#mydisablebutton').click( function () { $('#myimage').addClass('disabled'); });

이 코드를 사용하면 #mydisablebutton을 클릭하면 #myimage 요소에 비활성화 된 클래스가 추가됩니다. 이렇게하면 선택기가 더 이상 요소와 일치하지 않고 'disabled'클래스가 제거되어 .live () 선택기가 다시 유효해질 때까지 이벤트가 시작되지 않습니다.

이것은 해당 클래스를 기반으로 스타일을 추가함으로써 다른 이점도 있습니다.


3
사용하기 좋은 방법 live(), 전에는 이런 식으로 사용하는 것에 대해 생각한 적이 없습니다. 코딩 편의성 외에도 바인드 / 바인드 해제에 비해 다른 이점이 있습니까?
chakrit

2
요소를 추가 / 제거하는 경우 라이브와의 바인딩이 한 번만 수행되므로 바인드보다 확실한 성능 이점이 있습니다. jQuery는 특정 요소에 바인딩하는 대신보다 라이브 및 이벤트 위임으로 이동하는 것 같습니다.
MacAnthony

3
라이브를 비활성화하려면 die ()
Moons

9
"jQuery 1.7부터 .live () 메소드는 더 이상 사용되지 않습니다. .on ()을 사용하여 이벤트 핸들러를 첨부하십시오. 이전 버전의 jQuery 사용자는 .live ()보다 .delegate ()를 사용해야합니다." api.jquery.com/live
Lucas Pottersky

12
아, jQuery를 변태 시키십시오. 언젠가는 한 사람에게 300 명의 담당자를 데려옵니다. 다음 날은 더 이상 사용되지 않습니다.
MrBoJangles 2013

37

이벤트 에 한 번만 응답 하려면 다음 구문이 실제로 유용합니다.

 $('.myLink').bind('click', function() {
   //do some things

   $(this).unbind('click', arguments.callee); //unbind *just this handler*
 });

arguments.callee를 사용 하면 하나의 특정 익명 함수 처리기가 제거되어 주어진 이벤트에 대해 단일 시간 처리기가 있습니다. 이것이 다른 사람들을 돕기를 바랍니다.


2
물론 핸들러가 언 바운드되어야하는 시점에 대한 특정 논리를 원할 수도 있습니다 (예 : 텍스트 상자를 먼저 제출하지 않은 경우 바인드 해제하지 마십시오).
ghayes

5
arguments.callee는 엄격한 모드로 선언됩니다!
zloctb

37

바인딩 해제 기능을 사용하여 수행 할 수 있습니다.

$('#myimage').unbind('click');

jquery에서 동일한 객체 및 이벤트에 여러 이벤트 핸들러를 추가 할 수 있습니다. 이것은 새로운 것을 추가해도 기존의 것을 대체하지 않는다는 것을 의미합니다.

이벤트 네임 스페이스와 같은 이벤트 핸들러를 변경하기위한 몇 가지 전략이 있습니다. 온라인 문서에는 이것에 관한 몇 페이지가 있습니다.

이 질문을보십시오 (바인드 해제 방법을 배웠습니다). 답변에 이러한 전략에 대한 유용한 설명이 있습니다.

jquery에서 바운드 호버 콜백 함수를 읽는 방법


32

아마 바인딩 해제 방법이 당신을 위해 작동합니다

$("#myimage").unbind("click");

30

prop과 attr을 사용하여 이벤트를 null로 설정해야했습니다. 나는 하나 또는 다른 것으로 그것을 할 수 없었다. 또한 .unbind를 작동시킬 수 없었습니다. TD 요소를 작업 중입니다.

.prop("onclick", null).attr("onclick", null)

1
약 30 분 동안 onblur를 바인딩 해제하려고했기 때문에 이것을 투표했습니다. '.unbind'가 작동하지 않았고 '.prop'가 작동하지 않았고 '.attr'이 작동하지 않았지만 .prop와 .attr이 함께있는이 트릭은 트릭을 수행했습니다. 이상한. jquery 1.7.2와 Chrome을 사용하고 있습니다.
Jeremy

여기 동일합니다! 간단한 <a> 태그에서 클릭 이벤트를 제거하려고했습니다! 이것에 대한 감사합니다. 제 경우에는 .prop ( "onclick", null)이면 충분합니다.
Jan Lobau

여기에서도 마찬가지입니다. unbind 및 off jq 1.7.2와 FF에서 나를 위해 작동하지 않았고 .prop ( "onclick", null)도 충분했습니다.
bryanallott

4
위의 방법이 효과가 없었던 이유는 설정 방법 때문입니다. 이벤트 핸들러를 DOM에 작성한 경우 예, 이벤트 핸들러를 지우려면이 속성을 지우는 것이 필요하지만 대부분의 사람들 (자신 포함)은 그러한 것들 (javascrip, 이벤트 핸들러 등)을 DOM이므로 이벤트 핸들러를 설정할 때 $("#elementId").click(function(){//Event execution code goes here});html 페이지에 전혀없는 것과 같은 것을 사용 합니다. 우리가 실제로 .unbind(), 또는 선호하는 .off()
VoidKing

다음은 jQuery를 통해 추가 된 속성이 Chrome의 요소 패널에 표시되지 않는다는 것을 발견하기 위해 한 시간을 보낸 사람과 비슷합니다. 노력 unbind하고 off있으며 문제를 해결하지 않았습니다. 대단히 감사합니다!
Renan

13

이 방법으로 이벤트가 첨부 되고 대상이 연결 해제되는 경우 :

$('#container').on('click','span',function(eo){
    alert(1);

    $(this).off(); //seams easy, but does not work

    $('#container').off('click','span'); //clears click event for every span

    $(this).on("click",function(){return false;}); //this works.

});​

11

onclick핸들러를 인라인 마크 업 으로 추가 할 수 있습니다 .

<input id="addreport" type="button" value="Add New Report" onclick="openAdd()" />

그렇다면 jquery .off()또는 .unbind()작동하지 않습니다. jquery에도 원래 이벤트 핸들러를 추가해야합니다.

$("#addreport").on("click", "", function (e) {
   openAdd();
});

그런 다음 jquery에는 이벤트 핸들러에 대한 참조가 있으며이를 제거 할 수 있습니다.

$("#addreport").off("click")

VoidKing은 위의 주석에서 이것을 조금 더 비스듬히 언급합니다.


9

2014 년 업데이트

최신 버전의 jQuery를 사용하면 이제 간단히 네임 스페이스에서 모든 이벤트를 바인딩 해제 할 수 있습니다. $( "#foo" ).off( ".myNamespace" );


8

인라인 클릭 이벤트를 제거하는 가장 좋은 방법은 $(element).prop('onclick', null);


8

remove ALL event-handlers , 이것은 나를 위해 일한 것입니다 :

핸들러는 일반을 의미 모든 이벤트를 제거하려면 HTML structure모든없이 event handlers받는 부착 element하고 child nodes. 이렇게하려면 jQuery's clone()도움 이 되었습니다.

var original, clone;
// element with id my-div and its child nodes have some event-handlers
original = $('#my-div');
clone = original.clone();
//
original.replaceWith(clone);

이와 함께, 우리는해야합니다 clone의에서 장소 original아니오 event-handlers거기에 있습니다.

행운을 빕니다...


7

정보 주셔서 감사합니다. 다른 사용자가 편집 모드에있는 동안 페이지 상호 작용을 잠그는 데 매우 유용했습니다. 나는 그것을 ajaxComplete와 함께 사용했다. 반드시 같은 동작은 아니지만 다소 비슷합니다.

function userPageLock(){
    $("body").bind("ajaxComplete.lockpage", function(){
        $("body").unbind("ajaxComplete.lockpage");
        executePageLock();      
    });
};  

function executePageLock(){
    //do something
}

5

.on()다음 예제와 같이 메소드가 특정 선택기와 함께 이전에 사용 된 경우 :

$('body').on('click', '.dynamicTarget', function () {
    // Code goes here
});

unbind().off()방법 모두 작동 하지 않습니다 .

그러나 .undelegate () 메서드를 사용하면 현재 선택기와 일치하는 모든 요소에 대한 이벤트에서 처리기를 완전히 제거 할 수 있습니다.

$("body").undelegate(".dynamicTarget", "click")

1
이 솔루션을 찾는 동안 전체 페이지를 스크롤하여 매력처럼 작동했습니다.
Abhishek Pandey

4

$(document).on()동적으로 작성된 요소에 리스너를 추가하는 데 사용 하는 경우 다음을 사용 하여 리스너를 제거해야 할 수 있습니다.

// add the listener
$(document).on('click','.element',function(){
    // stuff
});

// remove the listener
$(document).off("click", ".element");


2

당신은을 설정하는 경우 onclick를 통해 html당신이 필요removeAttr ($(this).removeAttr('onclick'))

jquery를 통해 설정 한 경우 (위의 예제에서 첫 번째 클릭 후) unbind($(this).unbind('click'))


2

나는 이것이 늦게 오는 것을 알고 있지만 왜 일반 JS를 사용하여 이벤트를 제거하지 않습니까?

var myElement = document.getElementById("your_ID");
myElement.onclick = null;

또는 명명 된 함수를 이벤트 핸들러로 사용하는 경우 :

function eh(event){...}
var myElement = document.getElementById("your_ID");
myElement.addEventListener("click",eh); // add event handler
myElement.removeEventListener("click",eh); //remove it

좋은 제안, 가능한 경우 기본 자바 스크립트를 사용하는 것을 선호합니다
Michiel

1

클릭 이벤트 on()를 런타임에 요소가 작성된 문서 에 추가했기 때문에 설명 된 모든 접근 방식이 저에게 효과적이지 않았습니다 .

$(document).on("click", ".button", function() {
    doSomething();
});


내 해결 방법 :

".button"클래스를 바인딩 해제 할 수 없으므로 동일한 CSS 스타일을 가진 버튼에 다른 클래스를 할당했습니다. 이렇게하면 실시간 / 이벤트 핸들러가 클릭을 무시했습니다.

// prevent another click on the button by assigning another class
$(".button").attr("class","buttonOff");

희망이 도움이됩니다.


1

아래 코드가 모두 설명되기를 바랍니다. HTML :

(function($){

     $("#btn_add").on("click",function(){
       $("#btn_click").on("click",added_handler);
       alert("Added new handler to button 1");
     });

  
 
     $("#btn_remove").on("click",function(){
       $("#btn_click").off("click",added_handler);
       alert("Removed new handler to button 1");
     });

  
   function fixed_handler(){
    alert("Fixed handler");
  }
  
   function added_handler(){
    alert("new handler");
  }
  
  $("#btn_click").on("click",fixed_handler);
  $("#btn_fixed").on("click",fixed_handler);
  
  
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="btn_click">Button 1</button>
  <button id="btn_add">Add Handler</button>
  <button id="btn_remove">Remove Handler</button>
  <button id="btn_fixed">Fixed Handler</button>


1
})(jQuery);IIFE가 이미 전 세계에 액세스 할 수 있는데 왜 IIFE로 전달 합니까?
Bryan P

2
좋은 질문 브라이언. 이 방법은 연습으로 인해 제 유전자에 입력되었습니다. -비 jquery 플러그인이 $ 변수를 가질 가능성이 있으므로 $를 직접 사용할 수 없습니다. -js 스크립트 파일에서 단어 "jQuery"를 자주 사용하면 파일의 바이트 크기가 커질 수 있습니다. 여기서 jQuery는 6 바이트 문자열입니다. 따라서 "$"또는 단일 바이트 변수를 사용하는 것을 선호합니다.
mysticmo

0

버튼에서 간단히 제거하십시오.

$('.classname').click(function(){
$( ".classname" ).remove();
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.