认识延迟时间为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 相关文章推荐
javascript变量作用域使用中常见错误总结
Mar 26 Javascript
jQuery模拟点击A标记示例参考
Apr 17 Javascript
下一代Bootstrap的5个特点 超酷炫!
Jun 17 Javascript
javascript运算符语法全面概述
Jul 14 Javascript
JavaScript中日常收集常见的10种错误(推荐)
Jan 08 Javascript
js图片轮播插件的封装
Jul 21 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
详解Vue2.5+迁移至Typescript指南
Aug 01 Javascript
基于vue-draggable 实现三级拖动排序效果
Jan 10 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
Apr 10 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
Apr 22 Javascript
Vue 中获取当前时间并实时刷新的实现代码
May 12 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
JAVA/JSP学习系列之六
2006/10/09 PHP
做一个有下拉功能的留言版
2006/10/09 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
php实现读取内存顺序号
2015/03/29 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
Maps Javascript
2007/01/22 Javascript
[转]JS宝典学习笔记
2007/02/07 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
用JS实现简单的登录验证功能
2017/07/28 Javascript
Vue2.0+ElementUI实现表格翻页的实例
2017/10/23 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
Python信息抽取之乱码解决办法
2017/06/29 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
python list是否包含另一个list所有元素的实例
2018/05/04 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
python打印异常信息的两种实现方式
2019/12/24 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
几个Shell Script面试题
2012/08/31 面试题
造价工程师个人求职信
2013/09/21 职场文书
2014年社区个人工作总结
2014/12/02 职场文书