본문 바로가기
프로그래밍/jQuery

off(), 이벤트 해제하기

by zoo10 2012. 2. 24.

off

원문 링크 http://api.jquery.com/off/

.off( events [, selector] [, handler(eventObject)] )Returns : jQuery

개요 : 이벤트 핸들러 해제하기.

  • .off( events [, selector] [, handler(eventObject)] )
  • events 공백으로 구분된 하나 이상의 이벤트 타입과 옵션인 네임스페이스. "click", "keydown.myPlugin", ".myPlugin" 등이 있음.
  • selector 이벤트 바인딩을 위해 .on() 함수에서 사용된 선택자.
  • handler(eventObject) 바인딩 된 이벤트 또는 특수값인 핸들러 함수.
  • .off( events-map [, selector] )
  • events-map 공백으로 구분된 하나 이상의 이벤트 타입과 옵션인 네임스페이스로 구성된 문자열 키(keys)들과 값(values)들.
  • selector 이벤트 바인딩을 위해 .on() 함수에서 사용된 선택자.

off() 함수는 .on() 함수에 의해 바인딩 된 이벤트 핸들러를 제거합니다. 바인딩에 대한 내용은 .on() 함수를 살펴보시기 바랍니다. 특정 이벤트 처리기는 이벤트 이름, 네임 스페이스, 선택자, 또는 핸들러 함수 이름의 조합을 제공하여 요소에서 이벤트의 바인딩을 해제할 수 있습니다. 여러개의 필터 인자를 제공하면, 모든 인자들과 일치하는 것만 바인딩이 해제됩니다.

만약 "click"과 같은 간단한 이벤트 이름을 인자로 사용하면, 직접 추가하거나 나중에 바인딩 한 모든 이벤트들을 jQuery 집합 안에 있는 요소에서 제거시킬 수 있습니다. 플러그인으로 사용하여 코드를 작성하는 경우, 또는 단순히 대규모 코드 기반으로 작업을 할 때, 가장 좋은 방법은 코드가 실수로 다른 코드에 의해 연결된 이벤트 처리기를 제거하지 않도록 네임 스페이스를 사용하여 이벤트를 부착하고 제거하는 것입니다. 특정 네임 스페이스에 속한 모든 유형의 모든 이벤트는 ".myPlugin" 과 같은 네임스페이스를 이용하여 바인딩을 해제할 수 있습니다. 최소한 네임 스페이스 또는 이벤트 이름 중 하나가 제공 되어야 합니다.

특정 이벤트 핸들러를 제거하기 위해서는 selector 인자로 해야 합니다. 이 선택자(selector) 문자열은 .on() 함수에서 바인딩에 사용했던 인자와 동일해야 합니다. 핸들러에서 프로그래밍을 통해 바인딩 한 이벤트에 영향을 주지 않고 제거하기 위해 "**" 같은 특수한 값을 사용할 수 있습니다.

handler 인자 위치에 함수명을 사용해서 바인딩을 해제할 수도 있습니다. When jQuery 는 이벤트 핸들러를 바인딩할 때 함수 핸들러에 유니크 아이디를 부여(assign)합니다. jQuery.proxy() 함수나 그와 유사한 메커니즘에 의해 프록시 된 핸들러는 모두 같은 유니크 아이디(프록시 함수)를 가지게 됩니다. 그래서 프록시 된 핸들러들은 의도한 것보다 더 잘 제거할 수 있습니다. 이런 이유로 바인딩을 제거하는데 있어 네임스페이스를 이용하는 것보다 더 유용한 방법입니다. ( 사실 이 단락은 무슨 의미인지 잘 모르겠습니다. 아 이 짧은 지식이여~~ )

.on()과 마찬가지로, 인자로 공백으로 분리된 eventshandler 로 이루어진 events-map 을 사용할 수 있습니다. 키(keys)들은 이벤트거나 네임스페이스이고, 값(values)들은 핸들러 함수거나 특별한 값인 false 입니다.

예 제  
색깔이 있는 버튼에 이벤트 핸들러를 바인딩하고 해제하고 합니다.

<!DOCTYPE html>
<html>
<head>
  <style>
button { margin:5px; }
button#theone { color:red; background:yellow; }
</style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <button id="theone">Does nothing...</button>
<button id="bind">Add Click</button>
<button id="unbind">Remove Click</button>
<div style="display:none;">Click!</div>
<script>
function aClick() {
  $("div").show().fadeOut("slow");
}
$("#bind").click(function () {
  $("body").on("click", "#theone", aClick)
    .find("#theone").text("Can Click!");
});
$("#unbind").click(function () {
  $("body").off("click", "#theone", aClick)
    .find("#theone").text("Does nothing...");
});
</script>

</body>
</html>

미리보기

버튼을 클릭해 보세요.

 

예 제  
이 예제는 제가 만들어 본겁니다. direct와 delegated의 차이점과 on, off의 연동성을 알아보세요.

<!DOCTYPE html>
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <p>delegated event.</p>
  <p>delegated event.</p>
  <p onclick="alert('direct event')">direct event.</p>
  <p onclick="alert('direct event')">direct event.</p>

<script>
$("p").on("click", function(){
	alert("delegate event.");
});
//$("p").off("click");
</script>

</body>
</html>

미리보기

off에 주석처리되어 있는데 이 부분을 활성화 시킨신 후에 테스트해 보시면 조금 이해가 되시지 않을까 합니다.

 

예 제
모든 p 태그에서 이벤트 핸들러들을 제거합니다.

$("p").off()

 

예 제
모든 p 태그에서 모든 임의의 click 핸들러를 제거합니다.

$("p").off( "click", "**" )

 

예 제
세번째 인자로 바인딩 했던 단 하나의 핸들러만을 제거합니다.

var foo = function () {
  // code to handle some kind of event
};

// ... now foo will be called when paragraphs are clicked ...
$("body").on("click", "p", foo);


// ... foo will no longer be called.
$("body").off("click", "p", foo); 

 

예 제
네임스페이스에 포함된 모든 임의의 이벤트 핸들러를 해제합니다.

var validate = function () {
  // code to validate form entries
};

// delegate events under the ".validator" namespace
$("form").on("click.validator", "button", validate);

$("form").on("keypress.validator", "input[type='text']", validate); 

// remove event handlers in the ".validator" namespace

$("form").off(".validator");

 

이벤트 해제는 중요한 함수인 것 같습니다. 각 사용법을 잘 숙지하시어 사용하시구요. direct, 즉 개발자가 직접 넣은 javascript 이벤트 함수들은 해당이 없는거 잘 아시죠? "**"를 넣을때를 제외하고 말이죠. 내용은 쉽진 않네요.

그럼 즐프하세요.

※ 본 예제는 http://www.jquery.com 에 있는 내용임을 밝힙니다.