认识延迟时间为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 $.fn $.fx是什么意思有什么用
Nov 04 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
Jun 16 Javascript
原生js实现autocomplete插件
Apr 14 Javascript
基于JavaScript实现购物网站商品放大镜效果
Sep 06 Javascript
jquery把int类型转换成字符串类型的方法
Oct 07 Javascript
jQuery实现表格冻结顶栏效果
Aug 20 jQuery
Vue.js 表单控件操作小结
Mar 29 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
Dec 28 Javascript
基于vue通用表单解决方案的思考与分析
Mar 16 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
Sep 03 Javascript
jquery.tagsinput.js实现记录checkbox勾选的顺序
Sep 21 jQuery
JavaScript监听键盘事件代码实现
Jun 03 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
JS实现动态星空背景效果
2019/11/01 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
Python中生成器和yield语句的用法详解
2015/04/17 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
Pandas时间序列基础详解(转换,索引,切片)
2020/02/26 Python
从python读取sql的实例方法
2020/07/21 Python
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
工作粗心大意检讨书
2014/09/18 职场文书
文明单位申报材料
2014/12/23 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
英语教师求职信范文
2015/03/20 职场文书
早上好问候语大全
2015/11/10 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python