JavaScript 不能在循环中使用多个 setTimeout 函数

标签 javascript settimeout custom-data-attribute

我有这段代码,允许您设置定时延迟的 CSS 更改。它工作得很好,只是它只允许你拥有一个实例,而我需要它允许多个实例。目前它只从循环中取出最后一个元素并保留超时功能。有没有办法让这个循环中的所有超时函数都被保存并运行?我认为这只是 setTimeout 函数每次都被重写,而不是一个独特的函数。

注意:我没有收到任何控制台错误

Javascript(在 onload 函数内)

  elems = _('[data-timecss]'); //function to return elems via querySelectorAll()
  for (var i=0; i<elems.length; i++) {
     var tempelem = elems[i];
     var c_info = elems[i].dataset.timecss.split(","); //split to get time
     setTimeout(function() {
       var css_e = c_info[1].split(";"); //split to get css properties
       for (var c=0; c<css_e.length; c++) {
         var css_elem = css_e[c].split(":"); //split property and value
         tempelem.style.setProperty(css_elem[0], css_elem[1]); //set value
       }
     }, c_info[0]); //set time
  }

HTML

<div class="block">
  <p data-timecss="2000,color:green;font-weight:bold;">Change to green after 2000ms</p>
  <p data-timecss="5000,display:none;">Hide this block after 5000ms</p>
</div>

无论哪个 data-timecss 是最后一个,都将正确运行。所以我可以看出超时函数每次都被覆盖。有谁知道如何让这些独一无二,同时又像我一样保持活力?

最佳答案

你需要关闭 - How do JavaScript closures work?

elems = _('[data-timecss]'); //function to return elems via querySelectorAll()
for (var i=0; i<elems.length; i++) {
    (function(i) { // added this
        var tempelem = elems[i];
        var c_info = elems[i].dataset.timecss.split(","); //split to get time
        setTimeout(function() {
            var css_e = c_info[1].split(";"); //split to get css properties
            for (var c=0; c<css_e.length; c++) {
                var css_elem = css_e[c].split(":"); //split property and value
                tempelem.style.setProperty(css_elem[0], css_elem[1]); //set value
            }
        }, c_info[0]); //set time
    }(i)); // added this
}

关于JavaScript 不能在循环中使用多个 setTimeout 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32567471/

相关文章:

javascript - jQuery:选择不为空的数据属性?

javascript - 如何将 jQuery .data() 转换为 Vanilla JS?

javascript - 使用 Ajax/jQuery 发出 POST 请求以将行插入到 Node js 服务器上的 mysql 表中

python - 尽管超时,urllib2.urlopen 将永远挂起

jquery - 循环几个 setTimeout() 函数?

html - Jquery用html5数据属性隐藏和显示

javascript - 自动滚动到底部

javascript - 如何扩展 HTML 表格或构建 HTML 表格原型(prototype)

javascript - Firefox 扩展中的不透明度和 jQuery 淡入/淡出

javascript - 如何在 POSTMAN 上获得与浏览器相同的响应行为?