gpt4 book ai didi

javascript - jQuery/Javascript - 如何在继续执行函数之前等待操作的 DOM 更新

转载 作者:行者123 更新时间:2023-12-03 21:33:48 29 4
gpt4 key购买 nike

我想做的是在执行 CPU 密集型脚本之前更新一个简单的 div 来表示“正在处理...”(运行需要 3-12 秒,没有 AJAX),然后更新该 div 来表示“完成的!”完成后。

我看到的是 div 永远不会用“正在处理...”进行更新。如果我在该命令之后立即设置断点,那么 div 文本就会更新,所以我知道语法是正确的。 IE9、FF6、Chrome13 中的行为相同。

即使绕过 jQuery 并使用基本的原始 Javascript,我也会看到同样的问题。

您可能认为这会有一个简单的答案。但是,由于 jQuery .html() 和 .text() 没有回调 Hook ,因此这不是一个选项。它也不是动画的,因此没有可操作的 .queue。

您可以使用我在下面准备的示例代码自行测试,该代码显示了具有 5 秒高 CPU 函数的 jQuery 和 Javascript 实现。该代码很容易理解。当您单击按钮或链接时,您永远不会看到“正在处理...”

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" ></script>
<script type="text/javascript">
function addSecs(d, s) {return new Date(d.valueOf()+s*1000);}
function doRun() {
document.getElementById('msg').innerHTML = 'Processing JS...';
start = new Date();
end = addSecs(start,5);
do {start = new Date();} while (end-start > 0);
document.getElementById('msg').innerHTML = 'Finished JS';
}
$(function() {
$('button').click(function(){
$('div').text('Processing JQ...');
start = new Date();
end = addSecs(start,5);
do {start = new Date();} while (end-start > 0);
$('div').text('Finished JQ');
});
});
</script>
</head>
<body>
<div id="msg">Not Started</div>
<button>jQuery</button>
<a href="#" onclick="doRun()">javascript</a>
</body>
</html>

最佳答案

将其设置为处理,然后执行 setTimeout 以防止 CPU 密集型任务运行,直到 div 更新后。

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" ></script>
<script>
function addSecs(d, s) {return new Date(d.valueOf()+s*1000);}
function doRun() {
document.getElementById('msg').innerHTML = 'Processing JS...';
setTimeout(function(){
start = new Date();
end = addSecs(start,5);
do {start = new Date();} while (end-start > 0);
document.getElementById('msg').innerHTML = 'Finished Processing';
},10);
}
$(function() {
$('button').click(doRun);
});
</script>
</head>
<body>
<div id="msg">Not Started</div>
<button>jQuery</button>
<a href="#" onclick="doRun()">javascript</a>
</body>
</html>

您可以根据需要修改 setTimeout 延迟,对于较慢的机器/浏览器,它可能需要更大。

编辑:

您还可以使用警报或确认对话框来允许页面更新。

document.getElementById('msg').innerHTML = 'Processing JS...';
if ( confirm( "This task may take several seconds. Do you wish to continue?" ) ) {
// run code here
}

关于javascript - jQuery/Javascript - 如何在继续执行函数之前等待操作的 DOM 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7342084/

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