DOM操作被长时间运行的func阻塞,之后调用
DOM manip blocked by long-running func invoked *afterwards*?
简单问题。
DOM有什么特别之处,以至于在DOM操作调用后被调用的长时间运行的javascript函数阻止了对它的操作?这里有一个例子:
function notify(msg) {
var div = document.createElement("div");
div.textContent = msg;
document.body.appendChild(div);
}
// long-running func
function block() {
var iter = 3e8;
while (iter--)
Math.sqrt(iter);
notify("block() done!");
}
document.body.onclick = function(){
notify("click event!");
block();
};
两者,点击事件和块()完成在长时间运行的函数退出后同时出现,而不是单击事件立即触发并完成block()稍后出现。
这里有一个演示:http://jsfiddle.net/bxuNb/1/
if通知("点击事件!")替换为警报("点击事件!"),然后它立即响应。这是怎么回事?
谢谢!
DOM的特殊之处在于,javascript函数会阻止对其进行操作
它经过了优化。您的屏幕不会在每次与DOM交互后重新绘制。
…在DOM操作调用后调用
不可能知道在执行过程中没有进一步的DOM操作,因此它不会立即更新您的屏幕。尽管静态代码分析可以实现这一点,但在您的示例中还有另一个DOM操作。解释器就是不知道中间的几行代码会花那么长时间来执行。
如果你想让屏幕在两者之间更新,在第一次输出后超时启动长时间运行的块:
document.body.onclick = function(){
notify("click event!");
setTimeout(block, 0);
};
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 在chrome.tabs.onCreated之后加载HTML页面
- 在Jquery detachment()和appendTo()之后定位元素
- AngularJS:ng之后,重复$scope值未按预期更新
- 为什么元素的宽度在页面加载之后和那一刻之后不同
- 没有在Angular应用程序中定义firebase(在firebase迁移之后)
- Javascript复选框函数:;缺少:在属性id之后"
- 在刚刚调用的append函数之后,jquery.height()不会返回实际值
- 正在链接添加了以下内容::在之后
- JQuery hide()在show()之后不起作用,反之亦然
- 未执行Ajax循环的Javascript之后的代码
- 如何在`window.open`之后执行回调
- 如何在一个元素动画之后延迟
- 在XMLHttpRequest之后重新初始化jQuery
- <text区域>在我的html中包含event.keycode==13之后,wrap就不起作用了
- 在jAlert之后设置焦点
- 在Javascript中的ajax响应之后未调用Dropdown事件
- web浏览器中的离线应用程序存储数据并在之后上传
- DOM操作被长时间运行的func阻塞,之后调用
- 我应该在加载Jqgrid之前和加载grid之后使用方法来阻塞屏幕