Quelques idées viennent à l'esprit :
Idee n°1
Vous pouvez rendre une courte rafale idempotente. Par exemple, vous pourriez dire :
fonction maintenant() {
return (nouvelle Date()).getTime();
}
var autopagerInterval = 8000;
function startAutopager() {
var startImage = getCurrentImageNumber();
var startTime = maintenant();
var autopager = setInterval(
function() {
var timeSinceStart = maintenant() - startTime();
var targetImage = getCurrentImageNumber + Math.ceil(timeSinceStart/autopagerInterval);
if (getCurrentImageNumber() != targetImage)
setImageNumber(targetImage); // déclencher l'animation, etc.
},
autopagerInterval
);
return autopager;
}
Ainsi, même si la fonction s'exécute 1000 fois, elle s'exécutera toujours en seulement quelques millisecondes et n'animera qu'une seule fois.
note : Si l'utilisateur quitte la page et revient, elle aura défilé. Ce n'est probablement pas ce que l'auteur original veut, mais je laisse cette solution car c'est parfois ce que vous voulez.
Idee n°2
Une autre façon d'ajouter l'idempotence (tout en conservant votre fonction nextImage()
et sans qu'elle ne défile jusqu'au bas de la page) serait de faire en sorte que la fonction définisse un verrou mutex qui disparaît après une seconde (effacé par un autre délai). Ainsi, même si la fonction setInterval était appelée 1000 fois, seule la première instance s'exécuterait et les autres ne feraient rien.
var locked = false;
var autopager = window.setInterval(function(){
if (!locked) {
locked = true;
window.setTimeout(function(){
locked=false;
}, 1000);
nextImage();
}
}, 8000);
edit : cela peut ne pas fonctionner, voir ci-dessous
Idee n°3
J'ai essayé le test suivant :
function f() {
console.log((new Date()) + window.focus());
window.setTimeout(f, 1000);
}
f();
Il semble indiquer que la fonction est appelée toutes les secondes. C'est bizarre... mais je pense que cela signifie que les rappels sont bien appelés, mais que le rendu de la page refuse de se mettre à jour de quelque manière graphique que ce soit lorsque l'onglet est non focalisé, retardant toutes les opérations jusqu'au retour de l'utilisateur, mais les opérations continuent de s'empiler.
Aussi la fonction window.focus()
ne dit pas si la fenêtre est au premier plan ; elle DONNE le focus à la fenêtre, et est donc sans pertinence.
Ce que nous voulons est probablement ceci : Comment détecter quand un onglet est focalisé ou non dans Chrome avec Javascript? -- vous pouvez annuler votre intervalle lorsque la fenêtre perd le focus (blur) et le réinitialiser lorsqu'elle le regagne.
0 votes
Peut-être pouvez-vous ajouter une condition pour voir si la fenêtre est centrée avant d'exécuter la fonction nextImage()
0 votes
Désolé, comment cela se fait-il?
0 votes
Je viens de voir cela sur un forum mais je ne sais pas si cela fonctionne :
(window.focus){nextImage();}
0 votes
Hmm, cela ne semble pas avoir fonctionné non plus.
2 votes
@Ibu:
window.focus
est une fonction, pas un booléen. Il sera probablement toujours une valeur truthy.