手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >认识延迟时间为0的setTimeout
认识延迟时间为0的setTimeout
摘要:让我们看看我之前的文章: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!

【认识延迟时间为0的setTimeout】相关文章:

Node.js重新刷新session过期时间的方法

JavaScipt中Function()函数的使用教程

详解AngularJS中的http拦截

Bootstrap基础学习

js跨域请求的5中解决方式

javascript基础知识分享之类与函数化

javascript事件冒泡实例分析

javascript常用的方法分享

js事件监听器用法实例详解

JavaScript操作XML文件之XML读取方法

精品推荐
分类导航