2010-08-10 7 views
3

J'ai du code qui ajoute des événements mouseover et des événements mouseout à tous les balises 'a' sur une page. Je voudrais qu'il sorte que le mouseout commence une minuterie de 5 secondes après quoi il appelle une fonction. Cependant, si un nouvel événement mouseover se déclenche, il doit annuler tous les temporisateurs existants. Le code que j'utilise suit. Le setTimeout() fonctionne bien, mais il semble que le clearTimeout() ne référence pas le bon timeoutID, même si je l'ai déclaré globalement. Aucune suggestion?clearTimeout on Mouseover Événement ne pas effacer setTimeout de l'événement Mouseout

var timeoutID; 

function addMouseoverEvent() { 
    $('a').each(function(index) { 
     $(this).mouseover(function() { 
      clearTimeout(timeoutID); 
      // do stuff 
     }) 
    }); 
} 

function addMouseoutEvent() { 
    $('a').each(function(index) { 
     $(this).mouseout(function() { 
      timeoutID = setTimeout(function() { 
       // do stuff 
      }, 5000); 
     }) 
    }); 
} 

$(window).load(function() { 
    addMouseoverEvent(); 
    addMouseoutEvent(); 
}); 

Je devrais préciser qu'il ne devrait y avoir qu'une seule minuterie active. C'est pourquoi je voulais que ce soit global. Si un événement mouseover se produit, aucune minuterie ne doit rester. Et si un événement mouseout survient, un seul timer devrait être actif - celui déclenché par le dernier événement mouseout.

+0

y at-il des images à l'intérieur de vos points d'ancrage ou.? –

+0

Oui, il pourrait y avoir des images, on ne sait pas ce que seront les éléments hrome plugin qui va fonctionner sur chaque page visitée, donc le contenu des pages pourrait être quelque chose). – ggutenberg

Répondre

2

Si votre timeoutId est globall alors il va être écrasé à chaque itération de $('a').each(). Si vous utilisez 1.4, vous pouvez utiliser la méthode delay la plus probable. ou vous pouvez stocker le timeoutId sur l'élément avec $ (this) .data ('timeoutId', setTimeout (youFunction) `.

+0

Il ne l'attribue pas dans un '.each()' bien que cela arrive dans le gestionnaire ... en fait le '.each()' est étranger, il peut complètement supprimer cette fermeture. –

+0

Mais si ig est encore itératif, il y a plus d'un élément 'a' dans l'ensemble retranché ... l'utilisation de' each' est cependant redondante. – prodigitalson

+0

J'ai supprimé le .each() selon vos suggestions. Meilleur code, mais clearTimeout() ne fonctionne toujours pas. Si je stocke le timeoutID sur chaque élément, n'aurai-je pas besoin de parcourir le timeoutID de chaque élément lorsque j'appelle clearTimeout() afin de m'assurer que je les ai tous? – ggutenberg

4

Je sais qu'il a déjà été répondu, mais j'ai trouvé que simplement supprimer l'appel .each() fait apparaître .. fonctionne comme prévu Essayez le petit jeu de vol stationnaire sur this Fiddle

(function game() { 
    var timeoutID; 
    $('a').mouseover(function() { 
     $('#box').html('All is well.').removeClass('bang'); 
     clearTimeout(timeoutID); 
     // do stuff 
    }); 
    $('a').mouseout(function() { 
     $('#box').html('You have 2 seconds to return!'); 
     timeoutID = setTimeout(function() { 
      $('#box').addClass('bang').html('Too Late!'); 
      // do stuff 
     }, 2000); 
    }); 
}()); 

Il est très possible que je me manque quelque chose - mais le jeu de vol stationnaire semble fonctionner très bien

+0

Testé sur jsFiddle et vous avez raison, il fonctionne là. Je suis 90% positif que cela n'a pas fonctionné hier soir sur ma mise en place, mais il était tard et j'étais fatigué. +1 juste pour avoir pris le temps de tester ça et comme ça a l'air de fonctionner (du moins dans le bac à sable de fiddle). – ggutenberg