2013-08-21 4 views
-1

목록 항목 내에 앵커가 있습니다. 두 요소 모두 이벤트가 있습니다. 내에서 앵커를 클릭하면 목록 항목을 클릭하지 않도록하고 싶습니다.jQuery : 자식의 바인딩 해제 이벤트?

저는 혼돈을 피하고 싶습니다. 나는이 기능을 찾았지만 내가 원하는대로 내가 그들을 사용 할 수 없습니다 : 여기

// HTML 
<ul> 
    <li id="1">Item #1 <a href="" class="delete">[DEL]</a></li> 
    <li id="2">Item #2 <a href="" class="delete">[DEL]</a></li> 
    <li id="3">Item #3 <a href="" class="delete">[DEL]</a></li> 
    <li id="4">Item #4 <a href="" class="delete">[DEL]</a></li>  
</ul> 

// JS 
$("ul").sortable(); 

$(document).on("click", "li", function() { 
    alert("list-item clicked."); 
}); 

$(document).on("click", "a.delete", function(e) { 
    e.preventDefault(); 
    if (confirm("Del?")) { 
     alert("list-item clicked."); 
    } 
    // do nothing 
}); 

입니다 :

코드가 있다고 바이올린 : http://jsfiddle.net/UtE87/1/

가장 좋은 방법은 무엇입니까? 많은 감사드립니다!

답변

2

이벤트 전파로 인해 이벤트 전파를 중지해야합니다. 그것은 e.stopPropagation()를 호출하여 수행 할 수 있지만, 당신은 또한 기본 동작을 방지하기 때문에, 당신은 이벤트 핸들러에서 false를 반환 모두에 의해 할 수

$(document).on("click", "a.delete", function(e) { 
    if (confirm("Del?")) { 
     console.log("list-item a clicked."); 
    } 
    // do nothing 

    return false; //prevent default and stop propagation 
}); 

데모 : 당신은 클릭이었다 요소를 확인할 수 있습니다 Fiddle

+0

간단합니다, 와우. 부끄러운 줄 알아. 고마워, 내가 허락하자마자 너의 대답을 받아 들일거야! –

+2

@ Mr.Bombastic : 이것은 jQuery가 백그라운드에서 마술을하기 때문에 작동합니다. * 이벤트 위임 *을 사용하므로 두 핸들러 모두 동일한 요소에 바인드됩니다. jQuery가 없다면,'e.stopPropagation()'은 여기서 작동하지 않을 것입니다. (불행하게도 문서는 정확히 무슨 일이 일어나는지 설명하지 않습니다.) –

1

delete 요소가 클릭되지 않은 경우에만 목록 항목 클릭 기능을 실행하십시오.

데모 : http://jsfiddle.net/k5sdC/1/

jQuery를 :

$(document).on("click", "li", function(e) { 
    if (!$(e.target).is('a.delete')){ 
     alert("list-item clicked."); 
    } 
}); 
관련 문제