【问题标题】:clearInterval(intervalId) just stops the interval, it doesn't really clear itclearInterval(intervalId) 只是停止间隔,并没有真正清除它
【发布时间】:2019-01-10 10:41:25
【问题描述】:

我不太确定如何解决这个问题,因为我不明白我做错了什么 - 所以,每次我点击创建的“开始”按钮时,都会触发一个 setInterval:

$("#questBox").on("click", "#startQuestButton", function(){
    document.getElementById("startQuestButton").classList.add("hidden");
    var requiredTime = 10000;
    var timer = 0;

    var interval = setInterval(function(){
        if(timer>requiredTime){
            clearInterval(interval)
            document.getElementById("startQuestButton").classList.remove("hidden");
        }
        timer+=1000; 
    }, 1000);
}

startQuestButton 是一个 div,存在于我的 html 文件中:

<div id="startQuestButton"></div>

现在,当我第二次点击开始按钮时,会触发 2 个相同的 setIntervals,第三次点击 3 个,依此类推。 我什至尝试在单击开始按钮之前和之后将间隔设置为空。此外,只要间隔正在进行,开始按钮就会隐藏。我想完全破坏前一个间隔,以便在我按下开始按钮时只触发一个。 我需要 setInterval 来显示一个进度条,它模仿一个加载条(因此,每秒钟,彩色元素的宽度都会放大几个像素)。

【问题讨论】:

  • 停止和清除间隔是一回事——我认为问题出在开始间隔的按钮上,所以你必须显示代码。
  • 您能否提供更多源代码以及任何相关的 HTML?没有提供足够的信息来提供合适的答案。
  • 你能用codepen或jsbin演示你的代码吗?所以很清楚
  • 听起来你只需在点击开始按钮时调用clearInterval() 之前调用setInterval()
  • 我添加了html按钮代码和onclick功能。我在很多地方都调用了 clearInterval(),但它从未改变任何东西。

标签: javascript setinterval


【解决方案1】:

那是因为 setInteval() 不返回区间对象(不存在这样的东西 afaik)但它是 id 所以当你清除时,你只清除最后一个创建的,因为它是保存在interval中的id

var requiredTime = 2000;
var timer = 0;

var interval

function createInterval() {
  interval = setInterval(function(){
      if(timer>requiredTime){
          console.log(`cleared interval : ${interval}`)
          clearInterval(interval)
      }
      timer+=500; 
  }, 500);
  console.log(`created interval : ${interval}`)
}

document.getElementById("b").onclick = createInterval
&lt;button id="b"&gt;clickMe&lt;/button&gt;

一次只有一个想法是在重新创建之前清除

var requiredTime = 2000;
var timer = 0;

var interval

function createInterval() {
  // as pointed by Barmar the if here is not useful in production since clearInterval with a parameter that is not an interval id do nothing silently
  // I only keep it to prevent this snippets to log "cleared interval : undefined"
  if(interval) {
    clearInterval(interval)
    console.log(`cleared interval : ${interval}`)
  }
  
  interval = setInterval(function(){
      if(timer>requiredTime){
          clearInterval(interval)
          console.log(`cleared interval : ${interval}`)
      }
      timer+=500; 
  }, 500);
  console.log(`created interval : ${interval}`)
}

document.getElementById("b").onclick = createInterval
&lt;button id="b"&gt;clickMe&lt;/button&gt;

【讨论】:

  • 你真的不需要if(interval)clearInterval() 如果您使用不是间隔 ID 的参数调用它,则不会执行任何操作。
  • @Barmar 我添加以防止 sn-ps 记录 cleared inteval undefined
  • 是的,它真的只对调试语句有用,对生产代码没有用。
  • @Barmar 添加了一条评论以警告其他人 ;)
  • @jonatjano 哇,我按照你的例子,我得到了它的工作。非常感谢。 :)
猜你喜欢
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 2023-02-20
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多