input.focus();
input.select();
时,2多了一个延迟时间为0的setTimeout的外围函数,即:
setTimeout(function(){
input.focus();
input.select();
},0);
按照JavaScript:TheDefinitiveGuide5th的14.1所说:
在实践中,setTimeout会在其完成当前任何延宕事件的事件处理器的执行,以及完成文档当前状态更新后,告诉浏览器去启用setTimeout内注册的函数。
其实,这是一个把需要执行的任务从队列中跳脱的技巧。回到前面的例子,JavaScript引擎在执行onkeypress时,由于没有多线程的同步执行,不可能同时去处理刚创建元素的focus和select事件,由于这两个事件都不在队列中,在完成onkeypress后,JavaScript引擎已经丢弃了这两个事件,正如你看到的例子1的情况。而在例子2中,由于setTimeout可以把任务从某个队列中跳脱成为新队列,因而能够得到期望的结果。
这才是延迟事件为0的setTimeout的真正目的。在此,你可以看看例子3,它的任务是实时更新输入的文本,现在请试试,你会发现预览区域总是落后一拍,比如你输a,预览区并没有出现a,在紧接输入b时,a才不慌不忙地出现。其实我们是有办法让预览区跟输入框同步地,在此我没有给出答案,因为上面所说的,就是解决思路,tryityourself!