认识延迟时间为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 相关文章推荐
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
May 14 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
Jun 16 Javascript
基于jquery实现ajax无刷新评论
Aug 19 Javascript
JavaScript数据类型学习笔记分享
Sep 01 Javascript
微信小程序之数据双向绑定与数据操作
May 12 Javascript
React入门教程之Hello World以及环境搭建详解
Jul 11 Javascript
jquery鼠标悬停导航下划线滑出效果
Sep 29 jQuery
vue2.x select2 指令封装详解
Oct 12 Javascript
vue 实现复制内容到粘贴板clipboard的方法
Mar 17 Javascript
Vue.js组件实现选项卡以及切换特效
Jul 24 Javascript
关于layui 下拉列表的change事件详解
Sep 20 Javascript
vue远程加载sfc组件思路详解
Dec 25 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
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
提升PHP执行速度全攻略(上)
2006/10/09 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
php实现简单四则运算器
2020/11/29 PHP
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
在python中做正态性检验示例
2019/12/09 Python
Python bytes string相互转换过程解析
2020/03/05 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
python3代码中实现加法重载的实例
2020/12/03 Python
Python 用__new__方法实现单例的操作
2020/12/11 Python
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
中学教师实习自我鉴定
2013/09/28 职场文书
化工专业应届生求职信
2013/11/08 职场文书
人事主管岗位职责范本
2013/12/04 职场文书
机关单位动员会主持词
2014/03/20 职场文书
捐款倡议书
2014/04/14 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
普通党员个人整改措施
2014/10/27 职场文书
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript