认识延迟时间为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 相关文章推荐
jquery 学习之二 属性 文本与值(text,val)
Nov 25 Javascript
jQuery JSON实现无刷新三级联动实例探讨
May 28 Javascript
JavaScript中输出标签的方法
Aug 27 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
Aug 21 Javascript
jQuery实用技巧必备(下)
Nov 03 Javascript
js滑动提示效果代码分享
Mar 10 Javascript
Angular2 (RC5) 路由与导航详解
Sep 21 Javascript
原生js实现弹出层效果
Jan 20 Javascript
Vue+Vux项目实践完整代码
Nov 30 Javascript
JS实现登录页密码的显示和隐藏功能
Dec 06 Javascript
express中static中间件的具体使用方法
Oct 17 Javascript
JavaScript工具库MyTools详解
Jan 01 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
Zerg剧情介绍
2020/03/14 星际争霸
使用php4加速网络传输
2006/10/09 PHP
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
php获取参数的几种方法总结
2014/02/18 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
JavaScript 布尔操作符解析  && || !
2012/08/10 Javascript
Jquery简单分页实现方法
2015/07/24 Javascript
原生JavaScript制作计算器
2016/10/16 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
2017/04/27 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
浅谈微信页面入口文件被缓存解决方案
2018/09/29 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
python flask 多对多表查询功能
2017/06/25 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
python发送邮件脚本
2018/05/22 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
Python实现Linux监控的方法
2019/05/16 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
Python itertools.product方法代码实例
2020/03/27 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
自学考试自我鉴定范文
2013/09/26 职场文书
六查六看剖析材料
2014/10/06 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
2014年双拥工作总结
2014/11/21 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
初中家长评语大全
2014/12/26 职场文书