2012-07-02 2 views
1

다른 요소의 다른 이벤트가 트리거 될 때 요소에 이벤트를 바인딩하는 데 많은 문제가 있습니다. 내 HTML은 텍스트가 추가되면 텍스트가 추가되어 상황에 맞는 메뉴가 만들어집니다. 이 메뉴는 동적으로 생성 된 테이블이므로 클릭 이벤트를 요소에 바인딩하고 싶습니다. 그럼, 내 코드입니다 :jQuery - 이벤트를 한 번 바인드하십시오.

$("#TextBox").on("keypress", function(e) { 
    $("#Menu").find("td").on("click", function(event) {  
     event.stopPropagation(); 
     event.preventDefault(); 
     processText(event, $(this).children().text()); 
    }); 
    $(this).off(e); 
}); 

그러나 나는 왜 작동하지 않는지 모르겠다. 또한, 나는 변수를 만들려고 시도하고 플래그로 사용하지만, 작동하지 않습니다.

단지 바인딩을 해제하지 않으면 사용자가 키를 누른 횟수만큼 클릭 이벤트가 트리거됩니다. 하지만 언 바인딩하므로 한 번만 실행됩니다.

EDIT : 잘못된 이벤트를 처리하는 중 오류가 발생했습니다. "keypress"에서 테이블이 여전히 존재하지 않았기 때문에 "keyup"을 처리해야했습니다.

+0

(이전을 제거하지 않고) ...이 * 거의 * 확실히 당신이 원하지 않을 것입니다. 'keypress' 핸들러 밖에서 한번 * bind 할 필요가있다. – Matt

답변

2

이미 on 기능을 사용하고 있으므로. 이벤트 처리기를 바인딩의에 (이벤트 처리의 위임) 대체 버전을 사용하여 동적으로 추가하는 요소 :

사용하는 기능에 다음과 같이

$("#TextBox").on("keypress", function(e) { 
    $(this).off("keypress"); 
}); 

$("#Menu").on("click", "td", function(event) {  
     event.stopPropagation(); 
     event.preventDefault(); 
     processText(event, $(this).children().text()); 
}); 

확인 대한 추가 정보를 원하시면 링크 : http://api.jquery.com/on/#direct-and-delegated-events

+0

$ ("# Menu")는 여전히 존재하지 않기 때문에 그렇게 할 수 없습니다. 사용자가 텍스트 상자의 키를 누를 때 동적으로 만들어집니다. – synack

+0

@ Kits89 : 위젯을'$ ("body")로 변경하지 않으면 추가 할 특정 요소가 메뉴 항목에 있습니다. on ("click", "#Menu td", function (event) {' – Chandu

+0

+1 감사합니다. 해결책으로 편집 했으니 죄송합니다. 죄송합니다. – synack

4

이벤트가 실제로 한 번만 실행되도록하려면 $ .one()을 사용하여 바인딩 할 수 있습니다. 당신은 키를 누를 때마다 각`td`에 대한 새로운`click` 이벤트를 부착하고

http://api.jquery.com/one/

+0

+1 감사합니다. 매우 유용합니다! – synack

관련 문제