2010-06-01 2 views
8

나는 모든 상호 작용에서 기능을 실행할 ajax 앱을 가지고있다. 해당 기능에 대한 모든 설치 코드가 캡슐화 된 상태로 유지 될 때마다 매번 설치 기능을 실행할 수 있기를 원합니다. 그러나 바인딩 요소가 두 번 이상이면 처리기가 두 번 이상 실행된다는 것을 의미합니다. 이는 명백하게 바람직하지 않습니다. jQuery에서 두 번 이상 호출되는 핸들러없이 한 번 이상 요소에 대한 bind를 호출하는 우아한 방법이 있습니까?jQuery에서 단 한번의 클릭 만 바인딩하는 방법이 있습니까?

답변

8

당신은 one() 기능을 document에 이벤트를 첨부 할 수 있습니다 :

$(document).one('click', function(e) { 
    // initialization here 
}); 

일단 실행 다시 실행되지 않도록이 이벤트 핸들러는 다시 제거됩니다. 그러나 다른 요소의 click 이벤트 인 전에 을 실행하도록 초기화해야하는 경우 다른 것을 생각해야합니다. click 대신 mousedown을 사용하면 mousedown 이벤트가 click 이벤트 전에 발생하기 때문에 작동합니다.

+0

거기에');'가 없습니다. – Ben

+0

오 감사합니다 벤, 고정 ... –

+0

이 하나 몰랐어요. – DMin

12

사용자 jQuery one Tom이 말했던 것처럼 기능하지만 다시 바인딩하기 전에 핸들러를 바인딩 해제합니다. 익명 함수를 사용하는 것보다 변수에 이벤트 처리기를 할당하는 것이 도움이됩니다.

var handler = function(e) { // stuff }; 

$('#element').unbind('click', handler).one('click', handler); 

//elsewhere 
$('#element').unbind('click', handler).one('click', handler); 

또한 요소에 연결된 모든 클릭 처리기를 제거 .unbind('click') 할 수 있습니다.

1

Chetan Sastry의 답변이 원하는 것입니다. 기본적으로 $ (element) .unbind (event)를 호출하면된다. 모든 사건 전에. 당신이) (loadAllButtonClicks 같은 기능이있는 경우

그래서 그 페이지에 각 버튼에 대한 모든

$(element).on("click", function(){}); 

방법을 포함, 당신은 버튼을 클릭 할 때마다,이 분명히보다 더 생산하는 것으로 실행 각 버튼에 대해 하나의 이벤트. 이것은 단지 모든

$(element).on("click", function(){}); 

전에

$(element).unbind(event); 

를 추가 해결하기 위해하고 해당 요소에 대한 모든 이벤트 바인딩을 해제합니다, 다음 번의 클릭 이벤트를 추가합니다.

2

언 바인드가 트릭을하지 않으면 .off()를 사용할 수도 있습니다. 확인 .OFF에게 주어진 선택과 이벤트가 정확히 처음에()를 CSTE 연구진은 제공된 것과 일치합니다

$("div.selector").off("click", "a.another_selector");  
$("div.selector").on("click", "a.another_selector", function(e){ 

이이 문제를 다시로드 같은 아약스를 해결하는 나를 위해 일한 것입니다.

+0

$ (요소) .unbind (이벤트); 솔루션은 요소에서 유형의 모든 이벤트 (예 : 클릭)를 제거하지만이 방법은 문제의 selector와 관련된 이벤트를 제거하고 동일한 이벤트 유형을 공유하는 경우에도 다른 이벤트를 첨부합니다. –

관련 문제