认识延迟时间为0的setTimeout


Posted in Javascript onMay 16, 2008

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

input.focus();
input.select();
时, 2 多了一个延迟时间为 0 的 setTimeout 的外围函数,即:

setTimeout(function(){
 input.focus();
 input.select();
}, 0);
按照 JavaScript: The Definitive Guide 5th 的 14.1 所说:

在实践中,setTimeout 会在其完成当前任何延宕事件的事件处理器的执行,以及完成文档当前状态更新后,告诉浏览器去启用 setTimeout 内注册的函数。

其实,这是一个把需要执行的任务从队列中跳脱的技巧。回到前面的例子,JavaScript 引擎在执行 onkeypress 时,由于没有多线程的同步执行,不可能同时去处理刚创建元素的 focus 和 select 事件,由于这两个事件都不在队列中,在完成 onkeypress 后,JavaScript 引擎已经丢弃了这两个事件,正如你看到的例子 1 的情况。而在例子 2 中,由于setTimeout可以把任务从某个队列中跳脱成为新队列,因而能够得到期望的结果。

这才是延迟事件为 0 的setTimeout的真正目的。在此,你可以看看例子 3,它的任务是实时更新输入的文本,现在请试试,你会发现预览区域总是落后一拍,比如你输 a, 预览区并没有出现 a, 在紧接输入 b 时, a 才不慌不忙地出现。其实我们是有办法让预览区跟输入框同步地,在此我没有给出答案,因为上面所说的,就是解决思路,try it yourself! 

Javascript 相关文章推荐
js实现的日期操作类DateTime函数代码
Mar 16 Javascript
jQuery实现的类flash菜单效果代码
May 17 Javascript
使用JavaScript动态设置样式实现代码及演示动画
Jan 25 Javascript
jquery简单的拖动效果实现原理及示例
Jul 26 Javascript
javascript实现简单的Map示例介绍
Dec 23 Javascript
JS控制网页动态生成任意行列数表格的方法
Mar 09 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
Sep 17 Javascript
Bootstrap风格的WPF样式
Dec 07 Javascript
mui 打开新窗口的方式总结及注意事项
Aug 20 Javascript
图文介绍Vue父组件向子组件传值
Feb 17 Javascript
Vue加载json文件的方法简单示例
Jan 28 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
Apr 16 Javascript
用函数式编程技术编写优美的 JavaScript_ibm
May 16 #Javascript
Javascript模块模式分析
May 16 #Javascript
Dom加载让图片加载完再执行的脚本代码
May 15 #Javascript
直接生成打开窗口代码,不必下载
May 14 #Javascript
地震发生中逃生十大法则
May 12 #Javascript
通过修改referer下载文件的方法
May 11 #Javascript
JS启动应用程序的一个简单例子
May 11 #Javascript
You might like
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
JS跨域总结
2012/08/30 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
全面理解闭包机制
2016/07/11 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
2019/05/06 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
python实现函数极小值
2019/07/10 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
旷课检讨书大全
2014/01/21 职场文书
安全生产检讨书
2014/01/21 职场文书
库房保管员岗位职责
2014/04/07 职场文书
作息时间调整通知
2015/04/22 职场文书
黄埔军校观后感
2015/06/10 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python