我努力找出为什么这个函数只运行一次,但似乎没有一个解决方案适用(例如声明一个与函数同名的变量)。以下功能“scroll()”以所需的速度滚动我的页面以与正在播放的音频读数进行协调。它工作得很好,但只能在不刷新页面的情况下工作一次。
我哪里错了?
function scroll() {
var element = document.getElementById("scrolldiv");
var scrollingheight = element.scrollHeight - window.innerHeight;
var thirdscreen = (window.innerHeight * .31);
var halfscreen = (window.innerHeight * .69);
var delaypercent = (thirdscreen / element.scrollHeight) * 100;
var speedpercent = (halfscreen / element.scrollHeight) * 100;
var dur = $("#jquery_jplayer_audio_1").data("jPlayer").status.duration;
var speedcalc1 = (dur * speedpercent) / 100;
var speedcalc2 = dur - speedcalc1;
var speed = (speedcalc2 * 1000) / scrollingheight;
speed2 = (Math.round(speed * 4) / 4).toFixed(2);
var delay = (delaypercent * dur) * 10;
setTimeout(function(){
scrollinterval = setInterval("scrollmove()", speed2);
}, delay);
}
function scrollmove() {
if (localStorage.getItem("scrolling") == 'on') {
var position = $('#scrolldiv').scrollTop();
$('#scrolldiv').scrollTop(position + 1);
}
}
我意识到我的代码可以更优雅地编写,但是现在我正在努力让它运行起来。感谢您的任何输入
答案 0 :(得分:2)
我们知道setTimeout()只会执行一次,而setInterval()会重复执行。当您调用这些方法中的任何一个时,您将创建一个包含相关回调的变量对象。删除该对象时 - 使用clearInterval()取消setTimeout()exectutes或setInterval() - 该对象变为无效并收集垃圾。当发生这种情况时,它包含的回调及其所有变量也会被破坏。
因为您在setTimeout()中将setInterval()作为回调的一部分进行嵌套,所以一旦setTimeout()执行,就会删除setInterval()。您需要找到另一种方法来调用setInterval();