0

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.

Répondre

2

Par défaut, event's bubble, ce qui signifie qu'un événement dans un élément enfant atteint tous les éléments parents sauf si vous l'arrêtez. Ainsi, par exemple, un clic n'importe où sur la page est un événement click sur cet élément, c'est parent, et ainsi de suite jusqu'à document. Ce comportement se produit également avec des événements personnalisés jQuery comme tabsshow, mais si vous ne voulez pas vous pouvez arrêter l'événement de barbotage à l'aide event.stopPropagation(), comme ceci:

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

Ce arrête l'événement de tirer sur #firsttab parce qu'il ne fait plus de bulles là-bas. You can try your sample with this fix here.

+0

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

+0

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

+1

@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 :) –

Questions connexes