【发布时间】:2013-07-16 21:09:21
【问题描述】:
在我汇总的以下示例中寻找解决方案,甚至只是寻找一些“幕后”理论。
似乎对 DOM 的操作是以非阻塞方式发生的。换句话说,没有流控制来等待 DOM 语句的执行。
在本例中:http://jsfiddle.net/qHVJX/
在 onclick 事件之后执行两个语句。
-
将文本从左向右移动
document.getElementById('text').className = 'tr'; -
循环一段时间以停止执行。
for(var i = 0,temp=1000000000; i<temp;i++){var dummy=0;}
如果在执行每个语句时阻止了流控制,那么正如预期的那样,文本将从左向右移动,然后在循环中短暂暂停。相反,文本移位发生在循环迭代之后。
这表明 className 语句排队,而循环优先执行。
在本例中:http://jsfiddle.net/qHVJX/1/
onclick 事件后执行三个语句:
-
将文本从左向右移动
document.getElementById('text').className = 'tr'; -
循环一段时间以停止执行。
for(var i = 0,temp=1000000000; i<temp;i++){var dummy=0;} -
将文本从右向左移动。
document.getElementById('text').className = 'tl';
同样,如果在执行每个语句时阻止了流控制,那么正如预期的那样,文本将左移到右,然后在循环迭代时短暂停顿,然后文本从右移到左。
相反,执行循环并且从左到右和从右到左重新绘制文本永远不会发生。这说明了竞争条件。
setTimeout() 可以暂停执行足够长的时间,以便 DOM 语句执行它并避免排队;没有办法知道每个语句需要多长时间。如果间隔设置为短,则不会达到预期的结果。如果间隔设置得比它需要的长,那么性能就会受到影响。
在没有 setTimeout() 开销的情况下,有没有办法在 DOM 操作期间阻止执行?也许某种回调例程?
任何见解将不胜感激。谢谢。
【问题讨论】:
-
setTimeout(fn, 0) 即使是最长的数据集也应该足够长...
标签: javascript dom race-condition flow-control