为什么这个JavaScript函数只能工作一次?

时间:2015-05-21 20:59:44

标签: javascript

我努力找出为什么这个函数只运行一次,但似乎没有一个解决方案适用(例如声明一个与函数同名的变量)。以下功能“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);
  }
}

我意识到我的代码可以更优雅地编写,但是现在我正在努力让它运行起来。感谢您的任何输入

1 个答案:

答案 0 :(得分:2)

我们知道setTimeout()只会执行一次,而setInterval()会重复执行。当您调用这些方法中的任何一个时,您将创建一个包含相关回调的变量对象。删除该对象时 - 使用clearInterval()取消setTimeout()exectutes或setInterval() - 该对象变为无效并收集垃圾。当发生这种情况时,它包含的回调及其所有变量也会被破坏。

因为您在setTimeout()中将setInterval()作为回调的一部分进行嵌套,所以一旦setTimeout()执行,就会删除setInterval()。您需要找到另一种方法来调用setInterval();