在我汇总的以下示例中寻找解决方案,甚至只是一些“幕后”理论。
似乎对 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 操作期间阻止执行?也许某种回调例程?
任何见解将不胜感激。谢谢。