如何在长时间运行的事件中更新页面元素
How do update a page element while inside a long running event?
我有一个长时间运行的方法——我想向用户表明一个操作正在进行。这不是ajax调用,所以我不能使用过去使用的常见模式,例如在ajax事件之前显示一个旋转器,然后在成功时隐藏它。
在我的例子中——我没有进行ajax调用,而是进行一些非常繁重的DOM操作。
我在jsFiddle.net上有一个测试示例——我很想学习如何捕获事件。目前,我的"wait-message"div在我的操作完成的同一时间更新,这太迟了:(
完整的示例代码在这里:http://jsfiddle.net/rsturim/97hrs/6/
Javascript (jQuery)$(document).ready(function() {
$("#link-action").click(function(e) {
$("#wait-message").text("starting ...");
var count = longRunningMethod(1000000000);
$("#result").text(count);
$("#wait-message").text("completed.");
});
var longRunningMethod = function(countUpTo) {
var i = 0;
while (i <= countUpTo) {
i++;
}
return i;
};
});
HTML: <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;
};
});
基本上,浏览器不会呈现任何更改,直到脚本完成执行。它允许你做这样的事情:
- 隐藏所有类的div
- 显示其中一个div
在一行中,浏览器永远不会将显示的div渲染为隐藏,所以你不会看到奇怪的闪烁或在页面上移动的东西。
像我一样使用setTimeout,匿名点击处理程序将完成执行,浏览器将重新渲染,setTimeout中的匿名函数将运行(在渲染之后立即运行,因为没有实际的延迟)。
使用setTimeout或setInterval代替while循环;像15ms这样的亚秒级延迟应该足以防止窗口冻结/UI锁定。
相关文章:
- 基本D3.js:创建或更新元素
- 敲除绑定不更新元素值
- 使用新值循环 2000 个元素的数组时,浏览器更新元素需要很长时间
- 使用自定义绑定更新元素文本
- 在使用挖空自定义绑定时更新模型时更新元素
- 如何使用ng样式单击时更新元素样式
- 在 Backbone.Render 期间更新元素的类,当元素从模板生成时
- 使用 ajax 更新元素时的 JavaScript 页面跳转
- 更新元素时会显示隐藏列
- React不是更新元素,而是用相同的reactid创建新的元素
- jquery:在窗口调整大小时更新元素偏移量顶部
- 如何将数据从一个类传递到另一个类并更新元素'的内容
- Javascript:根据ID更新元素
- MongoDB中的Node.js更新元素
- 使用jquery更新元素
- 当data-*属性改变时,如何更新元素
- 如何在另一个元素的鼠标事件上更新元素的类?
- 如何更新元素的jsonView
- D3 Javascript:删除和更新元素
- Jquery递归更新元素类