J'ai un onglet (appelé firsttab) avec dans son contenu un autre onglet (appelé childtab). Nous lions l'événement tabshow-event au premier onglet. Si nous cliquons sur l'un des onglets dans "firsttab" tout fonctionne bien (Tab 1 - Tab 5) si nous cliquons sur l'un des onglets "childtab" (Tab 1.1 - Tab 1.3) l'événement tabshow qui sont liés à "firsttab" est triggerd.Pourquoi parsente tabsshow-event triggerd par childtab?
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);
}
Je down't understande pourquoi le tabsshow événement est triggerd par le childtab parce que je lie cet événement le premier onglet.
La réponse de ma jquery-cochée était: "bulle d'événements, vérifier la cible." mais je comprends ce qu'il veut dire.
i gérer le problème en modifier ma tabsshow-event-gestionnaire à:
$("#tabs").bind('tabsshow',
function(event, ui) {
if ((/#(.*?)$/im).exec(ui.tab.hash)[1] == this.id)
funcX(ui.index);
});
mais je vais comprendre où sont le problème.
ok je pense que je comprends. Le tabsshow-event form de childtab n'est pas géré, donc il ira jusqu'à l'élément parent jusqu'à ce que l'événement tabsshow soit géré par le firsttab-eventhandler. mais n'est-ce pas "stupide" de la part de jquery d'envoyer des évènements à un eventhandler qui ne s'y est pas lié? wouldnt jquery handel cette erreur? Je lie mon eventhandler à firsttab.tabshow-event pas à firsttab_and_all_childs.tabshow.event et à mon avis jquery ne devrait déclencher l'événement que si son référent l'objet cible lie le eventhandler avec une option "takeallchildevent". – Floyd
une deuxième question: dans votre solution, vous liez un second eventhandler à l'objet childtab. mais n'est-ce pas une meilleure solution pour le lier à tous les onglets comme: $ ("DIV.ui-tabs"). bind ('tabsshow', fonction (événement, ui) {event.stopPropagation();}); – Floyd
@floyddotnet - * Tous les * bulles d'événements, même s'ils sont gérés, ils continuent de bouillonner, à moins que vous ne renvoyiez false ou '.stopPropagation()', c'est ainsi que le DOM est * attendu * (avec ou sans jQuery). Pour votre deuxième commentaire, oui, c'est une approche parfaitement valide, assurez-vous juste de lancer * après * la création des onglets, sinon ils n'ont pas encore ajouté la classe 'ui-tabs'. Tout sélecteur qui trouve l'élément et lie un gestionnaire pour arrêter la propagation fonctionnera :) –