2009-09-28 7 views
0

Je l'ai fait, mais je vais avoir du mal à obtenir que cela fonctionne ...jQuery - comment utiliser stopPropagation()

J'ai besoin jquery suivante pour avoir une fonction de .stopPropagation, de sorte que l'animation ne deviendra pas fou si l'utilisateur passe trop vite sur trois éléments!

$(function() { 
      var tabContainers = $('div.subMenu > div'); 
      tabContainers.hide(); 

      $('.mainMenuDiv a').hover(
      function (e) { 
       tabContainers.filter(this.hash).slideDown(); 
       e.stop(); 
      }, 
      function(e){ 
       tabContainers.filter(this.hash).slideUp(); 
       e.stopPropagation(); 
      }); 
    }); 
+0

Je ne sais pas pourquoi vous voulez? Vous utilisez un effet de survol de sorte que le comportement général attendu est que si un utilisateur survole plusieurs éléments rapidement, ils s'animeront tous. Sinon, quels sont les critères que vous utilisez pour décider lequel de l'utilisateur veut réellement développer? (Ceci est généralement la raison pour laquelle le clic est l'interaction utilisateur préférée pour l'expansion et la dissimulation) – Steerpike

Répondre

4

On dirait que vous êtes à la recherche de la fonction stop qui annule toutes les animations incomplètes.

$('.mainMenuDiv a').hover(
    function (e) { 
     tabContainers.filter(this.hash).stop().slideDown(); 
    }, 
    function(e){ 
     tabContainers.filter(this.hash).stop().slideUp(); 
    } 
); 

ou si vous souhaitez être "annulées" essayer une animation en cours (s):

$('.mainMenuDiv a').hover(
    function (e) { 
     tabContainers.filter(this.hash).stop(true, true).slideDown(); 
    }, 
    function(e){ 
     tabContainers.filter(this.hash).stop(true, true).slideUp(); 
    } 
); 

Vérifiez la docs pour plus d'informations.

+1

+1, le deuxième code (avec le vrai, vrai) est le seul qui ne reste pas bloqué (comme expliqué dans mes commentaires sur les autres réponses). –

+0

Ah, oui, bon appel avec les (vrais, vrais) params. Je savais qu'il y avait quelque chose que j'avais oublié. Bon travail Marve. – KyleFarris

0
$(function() { 

     var tabContainers = $('div.subMenu > div'); 
     tabContainers.hide(); 

     $('.mainMenuDiv a').hover(function() { 

      tabContainers.filter(this.hash).dequeue().slideDown(); 

     },function() { 

      tabContainers.filter(this.hash).dequeue().slideUp(); 

     }); 

}); 

Espérons que cela aide. ;) Evénements "bulle vers le haut" de l'élément enfant à tous ses parents, et vous event.stopPropragation(); ou event.stopImmediatePropagation(). Cependant pour arrêter l'animation vous dequeue().

+0

Si l'utilisateur survole rapidement et très rapidement l'élément, l'animation sera bloquée sous IE et FF. Je ne sais pas si c'est un bug si, –

0

Je peux me tromper, mais cela pourrait fonctionner:

$(function() { 
    var tabContainers = $('div.subMenu > div'); 
    tabContainers.hide(); 
    $('.mainMenuDiv a').hover(function() { 
     tabContainers.filter(this.hash).stop().slideDown(); 
    },function() { 
     tabContainers.filter(this.hash).stop().slideUp(); 
    }); 
}); 
+0

Si l'utilisateur survole de manière répétée et très rapidement l'élément, l'animation sera «coincé» sous IE et FF. Je ne sais pas si c'est un bug bien. –

2

Attention lorsque vous utilisez stopPropagation() et stopImmediatePropagation() comme si elles étaient la même chose:

méthode
  • Le Event.stopPropagation() empêche l'objet événement de passer au nœud suivant, mais seulement après que tous les autres écouteurs d'événement sur le nœud actuel sont autorisés à s'exécuter. La méthode Event.stopImmediatePropagation() empêche également l'objet d'événement de passer au nœud suivant, mais n'autorise aucun autre écouteur d'événement sur le nœud en cours à s'exécuter.

Questions connexes