认识延迟时间为0的setTimeout_Javascript教程-查字典教程网
认识延迟时间为0的setTimeout
认识延迟时间为0的setTimeout
发布时间:2016-12-30 来源:查字典编辑
摘要:让我们看看我之前的文章:JavaScript的9个陷阱及评点,在第9点FocusPocus中提到的问题。原作者对这个认识有所偏差,其实不只是...

让我们看看我之前的文章:JavaScript的9个陷阱及评点,在第9点FocusPocus中提到的问题。原作者对这个认识有所偏差,其实不只是IE的问题,而是现有JavaScript引擎对于线程实现的问题(关于线程,我的概念其实不多,如果不对,希望读者多多指教)。.我们来看1和2。如果你能看看源代码,会发现我们的任务很简单,就是给文档增加一个input文本框,并聚焦和选中。请现在分别点击一下,可以看到,1并没有能够聚焦和选中,而2可以。它们之间的区别在于,在执行:

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!

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Javascript教程学习
    热门Javascript教程学习
    编程开发子分类