2012-10-29 3 views
2

stopPropagation 메소드없이 이벤트 버블 링을 중지 할 수 있습니다 방법 :나는이 같은 일부 HTML 코드가

<ul> 
    <li id='root' class='tree-node'> 
     root 
     <ul> 
     <li class='tree-node' id='node1'>node1</li> 
     <li class='tree-node' id='node2'>node2</li> 
     <li class='tree-node' id='node3'>node3</li> 
     <li class='tree-node' id='node4'>node4 
      <ul> 
       <li class='tree-node' id='node4-1' >node4-1</li> 
       <li class='tree-node' id='node4-2' >node4-2</li>      
      </ul> 
     </li> 
     </ul> 
    </li> 

<ul> 

내가

을 트리 노드 클래스가 각 태그에 이벤트를 클릭 바인딩 할도 클릭 바인딩

$(".tree-node").click(function(e){ 
    console.log($(this).attr("id")); 
}); 

$(document).click(function(e){ 
    console.log("document clicked!"); 
}); 

석재에 대한 대안은 있는가 : 여기

를 문서화하는 이벤트는 내 코드입니다 pPropagation()을 사용하여 node4-2에서 부모로 이벤트 버블 링을 중지 하시겠습니까?

바이올린 : http://jsfiddle.net/R6ySc/

+0

왜 stopPropagation을 사용하지 않으시겠습니까? – Adil

+0

나는 문서 클릭 이벤트를 호출하기 때문에 – Siami

답변

6

당신은 문서의 클릭 이벤트를 사용하고 거기에서 모든 것을 처리 할 수 ​​있습니다.

$(document).click(function(e){ 
    console.log("document clicked!");  
    var t = $(e.target); 
    if(t.attr("class") == "tree-node") { 
     console.log("tree node clicked"); 
    } 
});​ 

확인이 바이올린 :

$(document).on("click", ".tree-node", function(e) { 
    e.stopPropagation(); 
    console.log("tree node '" + $(this).attr("id") + "' clicked"); 
});​ 

참조 : 대안으로 http://jsfiddle.net/R6ySc/3/

은 또한 문서 (확인이에 대한 jQuery documentation)에 대한 onclick 이벤트에서 선택을 지정할 수 있습니다 , 아래의 설명을 확인하십시오

+1

전통적으로 (jQuery 1.7 이후)'$. (document) .on ('click', '.tree-node', function() {...})을 사용할 수있다. ',이 경우 클릭 된 노드는 함수 내에서'this '로 나타납니다. –

+0

@ Beetroot-Beetroot : 좋은 지적입니다. 그러나 나는 이것을 피들 (http://jsfiddle.net/R6ySc/4/)에서 시도한 다음 전파 문제가 다시 발생했습니다. 또한 일반 문서 클릭 (나무 바깥 쪽)은 더 이상 처리되지 않습니다. –

+1

Reinder, 간단히 예. 이 이벤트는 실제로 DOM 트리를 버블 링 할 때 모든 단계에서 실행됩니다. 나의 요점은 불완전했다. 나는 (필요한 경우)'(this == e.target)'을 테스트하여 핸들러에서 타겟이 아닌 클릭을 거부 할 수 있다고 덧붙여 야했다. [updated fiddle] (http://jsfiddle.net/R6ySc/5/)을 참조하십시오. 그리고 일반 문서 클릭 (나무 바깥 쪽)은 제대로 처리되지 않습니다. –