I have a tab (called firsttab) with in his content another tab (called childtab). We bind the tabshow-event to the firsttab.
If we click to one of the tabs in "firsttab" all work fine (Tab 1 – Tab 5).
If we click to one of the "childtab" tabs (Tab 1.1 – Tab 1.3) the tabshow-event who are bind to the "firsttab" is triggerd.
Testcase: 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>
JavaScript:
$("#firsttab, #childtab").tabs();
$("#firsttab").bind('tabsshow', function(event, ui) { funcX(ui.index); });
function funcX(idx){
alert('triggerd - index: ' + idx);
}
I don’t understand why the tabsshow-event is triggered by the childtab because I bind this event to the firsttab.
The answer of my jQuery-ticked was:
"Events bubble; check the target."
but I don’t understand what it means.
I handle the problem by change my tabsshow-event-handler to:
$("#tabs").bind('tabsshow',
function(event, ui) {
if ((/#(.*?)$/im).exec(ui.tab.hash)[1] == this.id)
funcX(ui.index);
});
but I will understand where are the problem.
By default, event’s bubble, meaning that an event in a child element goes up to all parent elements unless you stop it. So for example a click anywhere on the page is a
clickevent on that element, it’s parent, and so on up untildocument. This behavior also happens with any custom jQuery events liketabsshow, but if you don’t want it you can stop the event from bubbling usingevent.stopPropagation(), like this:This stops the event from firing on
#firsttabbecause it just doesn’t bubble up there anymore. You can try your sample with this fix here.