手机
当前位置:查字典教程网 >编程开发 >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】相关文章:

jQuery实现html表格动态添加新行的方法

jquery插件validation实现验证身份证号等

Bootstrap基础学习

简介JavaScript中的setTime()方法的使用

JavaScript容易犯错的九个陷阱

移到这里,就会自动点击

javascript元素动态创建实现方法

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

详解AngularJS中的http拦截

javascript事件冒泡实例分析

精品推荐
分类导航