jQuery를 사용하여 모든 클릭 이벤트 핸들러를 제거하는 방법은 무엇입니까?


121

문제가 있습니다. 기본적으로 사용자가 페이지에서 '편집'링크를 클릭하면 다음 Jquery 코드가 실행됩니다.

$("#saveBtn").click(function () {
    saveQuestion(id);
});

이렇게하면 저장 버튼의 onClick 이벤트가 saveQuestion()메소드를 호출 하고 '편집'링크를 클릭 한 질문의 ID를 전달합니다.

그러나 동일한 세션에서 사용자가 2 개의 질문에 대한 편집을 클릭하면 이전 click이벤트 처리기 를 덮어 쓰는 대신 대신 2 개의 이벤트 처리기가 실행됩니다. 하나는를 호출 saveQuestion(1)하고 다른 하나는를 호출 할 수 있습니다 saveQuestion(2). 이렇게하면 1 개의 질문이 다른 질문을 덮어 씁니다.

click버튼에 할당 된 모든 이전 이벤트 를 제거하는 방법이 있습니까?

답변:


203

다음 과 같이 이벤트를 제거 하려면 off () 를 사용 합니다 .

$("#saveBtn").off("click");

그러나 이렇게하면 이 요소에 연결된 모든 클릭 이벤트 가 제거됩니다 . SaveQuestion이있는 함수가 유일한 이벤트 바인딩이면 위의 작업이 수행됩니다. 다음을 수행하지 않는 경우 :

$("#saveBtn").off("click").click(function() { saveQuestion(id); });

31
jQuery를 1.7 때문에, 당신은에 오프 대신 바인딩과 바인딩 해제의 사용해야합니다
랄프 얀센

@LockTar 대신 이것을 작성하는 방법을 제안 할 수 있습니까?
John Magnolia

@JohnMagnolia 위의 변경 사항을 참조하십시오.
Ralph Jansen 2012

1
.addAttr ( 'onclick'); 또는 .removeAttr ( 'onclick');
Aliti

13

버튼에 할당 된 모든 이전 클릭 이벤트를 제거하는 방법이 있습니까?

$('#saveBtn').unbind('click').click(function(){saveQuestion(id)});

unbind()jQuery 3.0에서 더 이상 사용되지 않으며 off()1.7부터 사용 이 권장됩니다.
Skylar Ittner

7
$('#saveBtn').off('click').click(function(){saveQuestion(id)});

2

사용했다면 ...

$(function(){
    function myFunc() {
        // ... do something ...
    };
    $('#saveBtn').click(myFunc);
});

... 그러면 나중에 바인딩을 해제하는 것이 더 쉬울 것입니다.


1
어떻게 알아? 요소의 이벤트가 바인딩 된 방법에 관계없이 항상 동일한 방식으로 바인딩 해제 될 수 있습니다 ... $ ( '# saveBtn'). unbind ( 'whatever event (s)'); 이제 RE-BIND로 ... 예, 특정 상황에서는 기술이 더 쉬울 수 있습니다.
KyleFarris 2009

1
모든 클릭 이벤트의 바인딩을 해제해도 다르지 않습니다. 그러나 하나의 특정 작업 만 바인딩 해제하려면 해당 이벤트를 두 곳에서 다시 작성하고 싶지 않습니다. 당신이 말했듯이, 나중에 리 바인딩하고 싶다면 다시하기가 더 쉽습니다. 왜냐하면 세 번째로 함수를 작성할 필요가 없기 때문입니다.
Jarrett Meyer

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.