Javascript 如何在长时间运行的事件中更新页面元素?
我有一个长时间运行的方法——我想向用户指示操作正在进行。这不是和ajax调用,所以我不能使用我过去使用的常见模式在ajax事件之前显示(比如微调器),然后在成功时隐藏它 在我的例子中——我不是在做ajax调用,而是在做一些非常繁重的DOM操作 我在jsFiddle.net上有一个测试示例——我很想学习如何捕获事件。目前,我的“wait message”div在操作完成的同一时间更新,这太晚了:( 完整的示例代码如下: Javascript(jQuery)Javascript 如何在长时间运行的事件中更新页面元素?,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我有一个长时间运行的方法——我想向用户指示操作正在进行。这不是和ajax调用,所以我不能使用我过去使用的常见模式在ajax事件之前显示(比如微调器),然后在成功时隐藏它 在我的例子中——我不是在做ajax调用,而是在做一些非常繁重的DOM操作 我在jsFiddle.net上有一个测试示例——我很想学习如何捕获事件。目前,我的“wait message”div在操作完成的同一时间更新,这太晚了:( 完整的示例代码如下: Javascript(jQuery) $(文档).ready(函数(){ $(
$(文档).ready(函数(){
$(“#链接操作”)。单击(函数(e){
$(“#等待消息”).text(“开始…”);
var计数=longRunningMethod(100000000);
$(“#结果”)。文本(计数);
$(“#等待消息”).text(“已完成”);
});
var longRunningMethod=函数(倒计时){
var i=0;
虽然(i这里有一个解决方案。我不确定它是否适用于所有浏览器,您可能想在几个浏览器中测试它,但我认为它确实适用:
$(document).ready(function() {
$("#link-action").click(function(e) {
$("#wait-message").text("starting ...");
// Stuff to do after a render
setTimeout(function(){
var count = longRunningMethod(1000000000);
$("#result").text(count);
$("#wait-message").text("completed.");
}, 0);
});
var longRunningMethod = function(countUpTo) {
var i = 0;
while (i <= countUpTo) {
i++;
}
return i;
};
});
$(文档).ready(函数(){
$(“#链接操作”)。单击(函数(e){
$(“#等待消息”).text(“开始…”);
//渲染后要做的事情
setTimeout(函数(){
var计数=longRunningMethod(100000000);
$(“#结果”)。文本(计数);
$(“#等待消息”).text(“已完成”);
}, 0);
});
var longRunningMethod=函数(倒计时){
var i=0;
while(我使用setTimeout或setInterval而不是while循环;一个亚秒级的延迟(如15毫秒)应该足以防止窗口冻结/UI锁定。对我运行FF8没有影响。@lonesomeday它在Chrome IE中对我有效。在变为“完成”之前,div中会显示“开始…”.我不确定,但可能将0更改为1会使其在FF中工作?@lonesomeday我没有Firefox自己测试它。重复:
<div id="wait-message">
push button please
</div>
<hr />
<button id="link-action">Run Operation</button>
<hr />
<h1>Results:</h1>
<div id="result"> </div>
$(document).ready(function() {
$("#link-action").click(function(e) {
$("#wait-message").text("starting ...");
// Stuff to do after a render
setTimeout(function(){
var count = longRunningMethod(1000000000);
$("#result").text(count);
$("#wait-message").text("completed.");
}, 0);
});
var longRunningMethod = function(countUpTo) {
var i = 0;
while (i <= countUpTo) {
i++;
}
return i;
};
});