首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setInterval止损率为1%

setInterval止损率为1%
EN

Stack Overflow用户
提问于 2022-09-03 16:07:12
回答 3查看 30关注 0票数 0

我试图用setInterval同时动画三个计数器。

计数器应该分别停止在10、20和30,我已经将这些数字保存在一个数组data中,并将它们传递给setInterval的参数,然后当变量counter1, counter2, counter3大于或等于它们的clearInterval(this)10, 20, 30时,它们就应该停止了。

问题是他们都停在了1%,我不知道为什么.

代码语言:javascript
复制
const data = ['10', '20', '30'],
  item = document.getElementsByClassName('test');
  
let counter1 = 0,
  counter2 = 0,
  counter3 = 0;

function go(current, data, item) {
  if (current >= data) {
    clearInterval(this);
  } else {
    current++;
    item.textContent = current + '%';
  }
}

let go1 = setInterval(go, 10, counter1, data[0], item[0]),
  go2 = setInterval(go, 10, counter2, data[1], item[1]),
  go3 = setInterval(go, 10, counter3, data[2], item[2]);
代码语言:javascript
复制
<p class="test">0</p>
<p class="test">0</p>
<p class="test">0</p>

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-03 16:18:28

回调之外的计数器变量不会受到回调中的counter++的影响。相反,使用计数器数组并传入计数器的索引以进行检查。

代码语言:javascript
复制
const data = ['10', '20', '30'],
  item = document.getElementsByClassName('test');
  
let counters = [0, 0, 0];

function go(index, data, item) {
  if (counters[index] >= data) {
    clearInterval(this);
  } else {
    counters[index]++;
    item.textContent = counters[index] + '%';
  }
}

let go1 = setInterval(go, 10, 0, data[0], item[0]),
  go2 = setInterval(go, 10, 1, data[1], item[1]),
  go3 = setInterval(go, 10, 2, data[2], item[2]);
代码语言:javascript
复制
<p class="test">0</p>
<p class="test">0</p>
<p class="test">0</p>

还可以进行简化,以便只传递索引,然后将其用于dataitem数组。

票数 1
EN

Stack Overflow用户

发布于 2022-09-03 16:31:19

只要传递一个引用itemsdatacounters数组的索引,就可以大大简化它。

代码语言:javascript
复制
const data = [10, 20, 30],
  items = Array.from(document.getElementsByClassName('test'));

let counters = [0, 0, 0]

function go(index) {
  if (counters[index] >= data[index]) {
    clearInterval(this);
  } else {
    items[index].textContent = ++counters[index] + '%';
  }
}

let intervals = items.map((item, index) => setInterval(go, 100, index))
代码语言:javascript
复制
<p class="test">0</p>
<p class="test">0</p>
<p class="test">0</p>

票数 2
EN

Stack Overflow用户

发布于 2022-09-03 16:17:35

current的值永远不会改变,因为您的间隔回调总是用相同的值调用。我将使用setTimeout,而只是使用更新参数调用go (如果是current <= data )。

代码语言:javascript
复制
const data = ['10', '20', '30'];
const item = document.getElementsByClassName('test');
  
let counter1 = 0;
let counter2 = 0;
let counter3 = 0;

function go(current, data, item) {
  if (current <= data) {
    item.textContent = current + '%';
    setTimeout(go, 10, ++current, data, item);
  }
}

go(counter1, data[0], item[0]);
go(counter2, data[1], item[1]);
go(counter3, data[2], item[2]);
代码语言:javascript
复制
<p class="test">0</p>
<p class="test">0</p>
<p class="test">0</p>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73593671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档