我正在为处理不同方法的4000个元素处理一种“大”JSON对象,我想用显示该过程的文本更新div
标记。
但由于某些奇怪的原因(仅在Firefox和Chrome中测试过),他们不会使用文本更新DOM对象。
$("#estatusBar").text(_item.Centro_de_trabajo);
两者都喜欢继续计算所有数据和其他过程,而不花时间更新文本。但是,如果我只是在循环中编码Alert("")
,然后在chrome中点击“选中的框”,说明忽略所有其他警报,Chrome会突然开始更新文本。
所以我在想是否可以用某种代码“暂停”计算来停止和更新DOM元素,然后继续进行其他过程?
这是可能的还是这种奇怪行为的替代方法?
- 编辑 -
这是循环的代码
$.each(plantillas, function(_index, _item){
updateBar(_item.Centro_de_trabajo);
calculateItem(_item,_index);
a.push("<div class='blockee'><ul>"+ /*temp.join("")*/ t(_item) +"</ul></div>");
});
答案 0 :(得分:1)
您可以尝试使用web workers,将计算推迟到后台,这可以帮助您。 Web工作者的目的是做这件事(将大型计算推送到后台线程)。但是,这可能不适用于所有浏览器。您主要关注的是IE,只有IE 10支持它:
答案 1 :(得分:1)
不,你不能做什么警报。在某些情况下,这种限制真的很烦人,但如果你的问题只是一次长计算的进展,那么解决方案很简单。
而不是在一个循环中执行记录,而是在“足够小”的块中进行计算,然后执行类似
的操作function doit()
{
processBlockOfRecords();
updateProgressBar();
if (!finished()) {
setTimeout(doit, 0);
}
}
setTimeout(doit, 0);
使用此方法添加“中止”按钮以停止计算也很简单。
在你的例子中,循环是
$.each(plantillas, function(_index, _item){
updateBar(_item.Centro_de_trabajo);
calculateItem(_item,_index);
a.push("<div class='blockee'><ul>"+ /*temp.join("")*/ t(_item) +"</ul></div>");
});
所以计算可以用(未经测试的)
分割function processRecords(plantillas, completion_callback) {
var processed = 0;
var result = [];
function doit() {
// Process up to 20 records at a time
for (var i=0; i<20 && processed<plantillas.length; i++) {
calculateItem(plantillas[processed], processed);
result.push("<div class='blockee'><ul>" +
t(plantillas[processed]) +
"</ul></div>");
processed++;
}
// Progress bar update
updateProgress(processed, plantillas.length);
if (processed < plantillas.length) {
// Not finished, schedule another block
setTimeout(doit, 0);
} else {
// Processing complete... inform caller
if (completion_callback) completion_callback(result);
}
}
// Schedule computation start
setTimeout(doit, 0);
}
答案 2 :(得分:0)
你想在javascript中使用某种版本的等待或暂停或睡眠或类似的东西吗?
唯一的方法是
window.setTimeout()
您可以暂停任何功能。
检查这篇文章也可能有所帮助: Sleep/Pause/Wait in Javascript