2010-07-02 4 views
2

J'ai une fonction appelée testimonials() que, fondamentalement, cycles par un ensemble de divs, alors qu'il anime un div dans, anime dehors et anime la suivante dans.Arrêt fonction du cycle jQuery sur vol stationnaire

Maintenant, je voulais faites-le s'arrêter sur le DIV actuel une fois que la souris est dessus, autrement dit comme le survolant. Et je l'ai fait travailler en utilisant un code que j'ai reçu d'un autre poste sur ce site, je me demandais juste si quelqu'un pouvait me l'expliquer parce que je suis un peu nouveau à jQuery et je veux vraiment comprendre pourquoi cela fonctionne.

Le code est le suivant:

function testimonials() { 
    //function here 
} 

//to stop on hover 

var timerId = null; 

function startRotation() { 
    if (timerId) { 
     return; 
    } 
    timerId = setInterval('testimonials()', 5000); 
} 

function stopRotation() { 
    if (!timerId) { 
     return; 
    } 
    clearInterval(timerId); 
    timerId = null; 
} 

$(function() { 
    startRotation(); 
    $('.testimonials').hover(stopRotation, startRotation); 
}); 
+1

votre code est un code javascript pur. jquery est seulement un cadre tiers pour javascript – jantimon

+0

vous pourriez oublier d'accepter les bonnes réponses ... s'il vous plaît accepter, http://stackoverflow.com/questions/3163804/how-can-i-stop-a-jquery-function- on-hover/3163813 # 3163813 – Reigel

+0

@Ghommey: Il utilise * jQuery, cependant (tout en bas). –

Répondre

1

Alors, comment cela fonctionne ... cassons vers le bas morceau par morceau. .hover(func1, func2) est un raccourci pour .mouseenter(func1).mouseleave(func2), ce qui signifie que la première fonction s'exécute lorsque votre souris entre dans l'élément, la seconde quand elle part.

fonction d'abord, lorsque la souris entre:

function stopRotation() { 
    if (!timerId) { 
     return; 
    } 
    clearInterval(timerId); 
    timerId = null; 
} 

Ceci est l'arrêt de l'intervalle défini précédemment par setInterval() de courir plus, tuant la boucle de courant via clearInterval() et de compensation de la variable timerId, de sorte que la fonction startRotation redémarre la boucle quand il est prêt à (sur mouseleave).

fonction En second lieu, lorsque la souris quitte:

function startRotation() { 
    if (timerId) { 
     return; 
    } 
    timerId = setInterval('testimonials()', 5000); 
} 

Cette nouvelle commence la boucle en démarrant une minuterie pour exécuter testimonials() toutes les 5 secondes, mais seulement s'il n'y a pas une minuterie déjà en cours d'exécution (par checkin si timerId est défini). Il le fait via setInterval().

Un changement que je ferais, ne passe jamais une chaîne dans setInterval() ou setTimeout(), cela fonctionne un eval() en interne. Au lieu de cela, appelez directement la référence de la fonction, comme ceci:

timerId = setInterval(testimonials, 5000); 
+0

remplacez donc timerId = setInterval ('testimonials()', 5000); avec timerId = setInterval (testimonials, 5000); ? – Amit

+0

aussi, je suis un peu curieux, qu'est-ce que cette déclaration signifie même? Ainsi, par exemple, la fonction startRotation(). Il vérifie d'abord si timerId a une valeur. Si c'est le cas, il s'arrête et ne fait rien? Sinon, il définit la variable timerId sur "setInterval ('testimonials()', 5000), et cela fait en sorte que la fonction commence à fonctionner? Donc, en définissant une variable avec le setInterval (fonction), il le fait démarrer? ne dit pas VAR timerId = setInterval ..., en tant que tel, ce qui est timerId ??? – Amit

+0

@Amit - Oui sur le remplacement :) Oui sur les arrêts et ne fait rien (de sorte que vous n'avez pas plusieurs temporisateurs qui se produisent, ce qui déclenche "testimonials" plus souvent que vous voulez.) Pour 'setInterval (fonction, xx)' il est dit "exécuter cette fonction * toutes les * xx millisecondes. 'timerId' est déclaré juste avant les fonctions, en tant que variable globale:' var timerId = null; '. –