0

나는 자신의 콘텐츠에 다른 탭 (아이 탭이라고 함)이있는 탭 (firsttab)을 가지고 있습니다. 우리는 tabshow-event를 첫 번째 탭에 바인딩합니다.하위 탭을 기준으로 Parallels 탭 쇼 이벤트가 트리거되는 이유는 무엇입니까?

우리가 "childtab"탭 (Tab 1.1 - Tab 1.3) 중 하나를 클릭하면 "firsttab"의 탭 중 하나를 클릭하면 모두 잘 작동합니다 (Tab 1 - Tab 5). "firsttab"에 대한 바인딩이 트리거됩니다.

테스트 케이스 : http://jsfiddle.net/bM8Wh/

HTML :

<div id="firsttab"> 
    <ul> 
     <li><a href="#firsttab_1">Tab 1</a></li> 
     <li><a href="#firsttab_2">Tab 2</a></li> 
     <li><a href="#firsttab_3">Tab 3</a></li> 
     <li><a href="#firsttab_4">Tab 4</a></li> 
     <li><a href="#firsttab_5">Tab 5</a></li> 
    </ul> 

    <div id="firsttab_1"> 
     <div id="childtab"> 
      <ul> 
       <li><a href="#childtab_1">Tab 1.1</a></li> 
       <li><a href="#childtab_2">Tab 1.2</a></li> 
       <li><a href="#childtab_3">Tab 1.3</a></li> 
      </ul> 

      <div id="childtab_1">Tab 1.1</div>    
      <div id="childtab_2">Tab 1.2</div> 
      <div id="childtab_3">Tab 1.3</div> 
     </div> 
    </div> 
    <div id="firsttab_2">Tab 2</div> 
    <div id="firsttab_3">Tab 3</div> 
    <div id="firsttab_4">Tab 4</div> 
    <div id="firsttab_5">Tab 5</div> 
</div> 

자바 스크립트 :이 이벤트에 바인딩 때문에 tabsshow 이벤트가 childtab에 의해 triggerd 왜 내가 understande down't

$("#firsttab, #childtab").tabs(); 
$("#firsttab").bind('tabsshow', function(event, ui) { funcX(ui.index); }); 

function funcX(idx){ 
    alert('triggerd - index: ' + idx); 
} 

첫 번째 탭.

내 jquery-ticked의 답변은 다음과 같습니다. "이벤트 거품이 발생하고 대상을 확인하십시오." 그러나 나는 그가 의미하는 것을 이해합니다.

나는 내 tabsshow-이벤트 처리기를 변경하여 문제를 처리 :

$("#tabs").bind('tabsshow', 
    function(event, ui) { 
    if ((/#(.*?)$/im).exec(ui.tab.hash)[1] == this.id) 
     funcX(ui.index); 
    }); 

을하지만, 문제가 어디에 내가 이해할 것이다.

답변

2

기본적으로 event's bubble입니다. 즉, 중지하지 않는 한 하위 요소의 이벤트가 모든 부모 요소로 이동합니다. 따라서 예를 들어 페이지의 아무 곳이나 클릭하면 해당 요소에 대한 click 이벤트가 부모 역할을합니다. document까지 계속됩니다. 이 문제는 또한 tabsshow 같은 사용자 정의 jQuery를 이벤트와 함께 발생하지만, 당신이 그것을하지 않으려면 다음과 같이 event.stopPropagation()를 사용하여 버블 링에서 이벤트를 중지 할 수 있습니다

$("#childtab").bind('tabsshow', function(event, ui) { 
    event.stopPropagation(); 
}); 

이것은 #firsttab에 발사에서 이벤트를 중지 그것 때문에 더 이상 거품이 나오지 않습니다. You can try your sample with this fix here.

+0

나는 이해한다고 생각한다. tabshow-event form childtab은 처리되지 않으므로 tabsshow 이벤트가 firsttab-eventhandler에 의해 처리 될 때까지 부모 요소까지 올라갑니다. 하지만 이벤트 처리기에 이벤트를 발생시키는 jquery는 "바보"가 아닙니다. 이 실수를 jquery하지 않을까요? firsttab_and_all_childs.tabshow.event가 아닌 firsttab.tabshow 이벤트에 내 이벤트 핸들러를 바인딩합니다. 내 의견으로는 jquery는 리퍼러 대상이 내가 이벤트 핸들러를 "takeallchildevent"옵션으로 바인딩하는 경우에만 이벤트를 발생시켜야합니다. – Floyd

+0

두 번째 질문 : 솔루션에서 두 번째 이벤트 핸들러를 자식 탭에 바인딩합니다. 그러나 모든 탭에 다음과 같이 바인딩하는 것이 더 좋은 해결책은 아닙니다 : $ ("DIV.ui-tabs") bind ('tabsshow', function (event, ui) {event.stopPropagation();}); – Floyd

+1

@floyddotnet - * 모든 이벤트는 버블 링됩니다. 버블이 계속 되더라도'return false' 나'.stopPropagation()'을 사용하지 않는 한, 이것은 DOM이 어떻게 동작 할 것인가에 대한 것입니다. jQuery없이). 두 번째 주석에 대해서는 완벽하게 유효한 접근법입니다. 탭을 만든 후 * 실행해야합니다. 그렇지 않으면'ui-tabs' 클래스가 아직 추가되지 않았습니다. 요소를 찾아 전달자를 바인드하는 셀렉터가 작동합니다. :) –

관련 문제