javascript 循环冻结浏览器并且在循环之前看不到变化
javascript loop freezes browser and can't see change before loop
我有一个简单的 javascript 循环,如下所示:
function runCode() {
$("#sample-span").removeAttr("style");
for (var i = 0; i < 100000; i++) {
console.log(new Date());
}
$("#sample-span").toggleClass("colorized");
}
在页面中切换class的跨度如下:
<span id="sample-span" style="color: orange;">Sample Text</span>
<input type="button" value="click to run" onclick="runCode()" />
<style>
span {
color: blue;
}
.colorized {
color: red;
}
</style>
问题是当循环 运行 页面冻结并且看不到跨度颜色变化。
我该如何解决这个问题?
更新
亲爱的,console.log(new Date());
只是一个示例,您假设这里是 运行 重 javascript 过程。
你到底想做什么?如果您希望文本显示为红色,然后在指定时间后切换回来,您真正需要的是 setTimeout。
$("#sample-span").toggleClass("colorized");
setTimeout(function() { $("#sample-span").toggleClass("colorized") }, 1000);
这是因为您在单击按钮时切换 class 两次。
如果你想在完成时改变跨度的颜色,那么写:function runCode() {
$("#sample-span").toggleClass("colorized");
for (var i = 0; i < 100000; i++) {
console.log(new Date());
}
}
你必须在 运行 繁重的过程之前更改颜色后添加一个小的延迟:
function runCode() {
$("#sample-span").toggleClass("colorized");
setTimeout(runTask,10)
}
function runTask(){
for (var i = 0; i < 100000; i++) {
console.log(new Date());
}
$("#sample-span").toggleClass("colorized");
}
您的代码存在的问题是 javascript 任务队列在执行 DOM 操作之前执行您函数中的所有可用代码。这意味着注册 class 切换调用,执行循环,然后连续执行切换,因此您看不到颜色变化。
您需要做的是将函数的第二部分发送到任务队列的末尾,如下所示:
function runCode() {
$("#sample-span").toggleClass("colorized");
// allows the first toggle to execute and sends the loop and the second
// toggle to the end of the task queue
setTimeout(function() {
for (var i = 0; i < 5000; i++) {
console.log(new Date());
}
$("#sample-span").toggleClass("colorized");
}, 0);
}
我减少了迭代次数以减少浏览器锁定,您仍然可以看到颜色变化。
我有一个简单的 javascript 循环,如下所示:
function runCode() {
$("#sample-span").removeAttr("style");
for (var i = 0; i < 100000; i++) {
console.log(new Date());
}
$("#sample-span").toggleClass("colorized");
}
在页面中切换class的跨度如下:
<span id="sample-span" style="color: orange;">Sample Text</span>
<input type="button" value="click to run" onclick="runCode()" />
<style>
span {
color: blue;
}
.colorized {
color: red;
}
</style>
问题是当循环 运行 页面冻结并且看不到跨度颜色变化。
我该如何解决这个问题?
更新
亲爱的,console.log(new Date());
只是一个示例,您假设这里是 运行 重 javascript 过程。
你到底想做什么?如果您希望文本显示为红色,然后在指定时间后切换回来,您真正需要的是 setTimeout。
$("#sample-span").toggleClass("colorized");
setTimeout(function() { $("#sample-span").toggleClass("colorized") }, 1000);
这是因为您在单击按钮时切换 class 两次。
如果你想在完成时改变跨度的颜色,那么写:function runCode() {
$("#sample-span").toggleClass("colorized");
for (var i = 0; i < 100000; i++) {
console.log(new Date());
}
}
你必须在 运行 繁重的过程之前更改颜色后添加一个小的延迟:
function runCode() {
$("#sample-span").toggleClass("colorized");
setTimeout(runTask,10)
}
function runTask(){
for (var i = 0; i < 100000; i++) {
console.log(new Date());
}
$("#sample-span").toggleClass("colorized");
}
您的代码存在的问题是 javascript 任务队列在执行 DOM 操作之前执行您函数中的所有可用代码。这意味着注册 class 切换调用,执行循环,然后连续执行切换,因此您看不到颜色变化。
您需要做的是将函数的第二部分发送到任务队列的末尾,如下所示:
function runCode() {
$("#sample-span").toggleClass("colorized");
// allows the first toggle to execute and sends the loop and the second
// toggle to the end of the task queue
setTimeout(function() {
for (var i = 0; i < 5000; i++) {
console.log(new Date());
}
$("#sample-span").toggleClass("colorized");
}, 0);
}
我减少了迭代次数以减少浏览器锁定,您仍然可以看到颜色变化。