gpt4 book ai didi

javascript - 使用 ajax 更新元素直到 for 循环结束才生效

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:54:37 25 4
gpt4 key购买 nike

我想用 AJAX 一个接一个地打印很多数字。

像这样:(每一行都是前一行的更新!)

output is:
1
12
123
1234
12345
123456
...

我尝试了很多,也阅读了很多相同的问题,但我找不到正确的答案。

真正的问题是 javascript 中的每个 FOR 循环在循环结束后都不会影响 DOM。我只想在处理长时间运行的作业时更新 FOR 循环内的 DOM。

请看我的代码。

$("#btn").on("click", dowork);

function dowork() {
document.getElementById("foo").innerHTML = "working";
setTimeout(function() {
var counter = 100; // i want assign counter = 2000000000
for (var i = 0; i < counter; i++) {
document.getElementById("print_here").innerHTML += i;
}
document.getElementById("foo").innerHTML = "done!";
}, 50);
}
#btn {
background: #1f1f1f;
padding: 10px;
font-weight: bolder;
color: #fff;
width: 50%;
margin: auto;
margin-top: 10px;
text-align: center;
cursor: pointer;
}

#print_here {
overflow-wrap: break-word;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="btn">CLICK TO DO WORK</div>
<div id="foo"></div>
<div id="print_here"></div>

感谢您的回答和帮助解决这个问题。

最佳答案

您的 DOM 在更新和重绘循环完成时被“锁定”。每次将 DOM 更改包装在 setTimeout 中时,您可以释放资源让 DOM 更新,类似于:

setTimeout(function(){
document.getElementById("print_here").innerHTML += i;
},1);

要确保 setTimeout 使用正确的 i 值,请使用 let i 而不是 var i

$("#btn").on("click", dowork);

function dowork() {
document.getElementById("foo").innerHTML = "working";

var counter = 3000; // i want assign counter = 2000000000
for (let i = 0; i < counter; i++) {
setTimeout(function() {
document.getElementById("print_here").innerHTML += i;
}, 1);
}
document.getElementById("foo").innerHTML = "done!";
}
#btn {
background: #1f1f1f;
padding: 10px;
font-weight: bolder;
color: #fff;
width: 50%;
margin: auto;
margin-top: 10px;
text-align: center;
cursor: pointer;
}

#print_here {
overflow-wrap: break-word;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="btn">CLICK TO DO WORK</div>
<div id="foo"></div>
<div id="print_here"></div>

I want change the #foo into "done!" after the FOR statement is END

您可以检查您是否在 setTimeout 中处理的最后一项,类似于:

if (i == counter - 1){
document.getElementById("foo").innerHTML = "done!";
}

$("#btn").on("click", dowork);

function dowork() {
document.getElementById("foo").innerHTML = "working";

var counter = 3000; // i want assign counter = 2000000000
for (let i = 0; i < counter; i++) {
setTimeout(function() {
document.getElementById("print_here").innerHTML += i;
if (i == counter - 1){
document.getElementById("foo").innerHTML = "done!";
}
}, 1);
}
}
#btn {
background: #1f1f1f;
padding: 10px;
font-weight: bolder;
color: #fff;
width: 50%;
margin: auto;
margin-top: 10px;
text-align: center;
cursor: pointer;
}

#print_here {
overflow-wrap: break-word;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="btn">CLICK TO DO WORK</div>
<div id="foo"></div>
<div id="print_here"></div>

关于javascript - 使用 ajax 更新元素直到 for 循环结束才生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48184493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com