javascript - 为什么在间隔完成之前我的代码没有运行?
问题描述
在片段中,我希望在弹出之前将的颜色timer
变为红色。alert
我以前写过$("#timer").css('color', 'red');
,alert("Time Up!")
所以从逻辑上讲,它应该在显示警报之前更改文本颜色,但在显示警报后它会更改颜色。
let time = 3;
$(function() {
let interval = setInterval(function() {
time--;
if (time >= 0)
document.getElementById("timer").innerHTML = time + "";
else {
$("#timer").css('color', 'red');
clearInterval(interval);
alert("Time Up!")
}
}, 1000);
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1 id="timer">3</h1>
解决方案
问题是因为alert()
阻止了 UI 更新,尽管您在之前调用css()
过 alert()
,但在警报出现之前没有足够的时间更新 DOM,并且暂时阻止了任何进一步的渲染。
要解决此问题,请将alert()
呼叫置于具有短暂延迟的超时状态。这允许在显示之前更新 UI alert()
:
let time = 3;
jQuery($ => {
let interval = setInterval(function() {
time--;
if (time >= 0) {
$("#timer").html(time);
} else {
$("#timer").css('color', 'red');
clearInterval(interval);
setTimeout(() => alert("Time Up!"), 0);
}
}, 1000);
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1 id="timer">3</h1>
推荐阅读
- prolog - 有什么方法可以检查输入 n 是否小于或等于列表的长度?
- .htaccess - htaccess 重定向 301 带有非友好尾部的友好链接
- java - Scala、Akka-Http 和 mysql - 太慢了
- elasticsearch - 使用 ElasticSearch 混合用户数据
- java - 将 csv / xml 文件映射到 java 对象
- java - 重定位节点 JavaFX
- c++ - 如何在屏幕上显示对象列表?
- javascript - EventListener 在某些功能之前不起作用
- git - Sonarqube 旧代码异味出现在新代码中
- javascript - 在 Javascript 中拦截垃圾回收