2014-11-05 5 views
1

클릭 이벤트 리스너가 바인딩 된 링크가 있습니다. 클릭 할 때 클릭 이벤트 리스너가 문서에 첨부됩니다.이 때 이벤트는 쉽게 제거 할 수 있도록 네임 스페이스로 표시됩니다. 두 번째 이벤트를 연결하면 즉시 시작됩니다. 왜 이런 일이 발생합니까? 내 생각 엔 새 이벤트가 문서에 첨부 될 때 이벤트가 여전히 dom 트리 위로 버블 링되고 있다는 것입니다. 이 때문에 두 이벤트를 모두 트리거합니다. JSFiddle을 참조하십시오.이벤트 리스너 내에서 jQuery 바인딩 이벤트

HTML

<a href="#" id="example">Click Me</a> 

자바 스크립트

$('#example').on('click', function(e) { 
    $(document).on('click.example', function(e) { 
     alert('example event triggered'); 
    }); 
}); 

내가 달성하기 위해 시도하고 그것이 내가 DOM 요소를 삽입 버튼을 클릭에 있습니다. 삽입 될 때 삽입 된 요소 외부에서 클릭 이벤트가 발생했는지 감지하기 위해 트리거 될 때 이벤트 대상을 검사하는 문서에 이벤트 수신기를 첨부하려고합니다. 대상이 그 안에 있으면 아무 것도 수행하지 않아야합니다. 대상이 요소 외부에 있으면 요소를 숨겨야합니다.

+1

의 ... 모든 클릭에 희망 촬영 한 치료를 새 처리기를 추가해서는 안 아주 이상하고 내 의견으로는 잘못 – noobed

+0

주어진 예제에서 당신은 정확합니다, 그렇게 할 것입니다. 내 실제 코드에는 이미 이벤트 리스너가 있는지 여부를 확인하기 위해 검사가 실행되고 있으므로 다시 연결되지 않습니다. 생성 된 요소 외부를 클릭하면 이벤트는 해제 된 상태로 언 바운드됩니다. – aronkerr

+0

"init 메소드"에서 이벤트를 바인드하지 않는 이유는 무엇입니까? 이 방법은 런타임에 상황을 점검하기 위해 삶을 조금 더 어렵게 만드는 대신 한 번만 바인딩합니다. – noobed

답변

2

이 때문에 이벤트 전파이다

$('#example').on('click', function(e) { 
 
    $(document).on('click.example', function(e) { 
 
    alert('example event triggered'); 
 
    }); 
 
    e.stopPropagation(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<a href="#" id="example">Click Me</a>

당신은 이벤트가 anchor 요소에 여전히 때 핸들러를 등록하고 이벤트가있는 문서 객체에 바인딩 현재 요소의 조상. 이제 이벤트가 전파되어 document 오브젝트에 도달하면 클릭 핸들러가 바인딩 된 것을 발견하고 트리거합니다.

참고 : 당신은이 어떻게 든 당신이 "CSTE 연구진은 $ (문서)"는 바인딩됩니다 # 예제에 모든 클릭에