认识延迟时间为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来动态的修改url实现对url的增删查改
Sep 05 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
Nov 02 Javascript
简单实现轮播图效果的实例
Jul 15 Javascript
Laravel中常见的错误与解决方法小结
Aug 30 Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
JavaScript轮播图简单制作方法
Feb 20 Javascript
vue 循环加载数据并获取第一条记录的方法
Sep 26 Javascript
JavaScript实现省份城市的三级联动
Feb 11 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
Aug 04 Javascript
vue 实现锚点功能操作
Aug 10 Javascript
JavaScript canvas实现跟随鼠标移动小球
Feb 09 Javascript
利用js实现简单开关灯代码
Nov 23 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
PHP 存取 MySQL 数据库的一个例子
2006/10/09 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
jQuery性能优化的38个建议
2014/03/04 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
编写高性能Javascript代码的N条建议
2015/10/12 Javascript
vue.js初学入门教程(2)
2016/11/07 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
python清除指定目录内所有文件中script的方法
2015/06/30 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
python中itertools模块zip_longest函数详解
2018/06/12 Python
Python正则表达式指南 推荐
2018/10/09 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
python Xpath语法的使用
2020/11/26 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
Happy Socks英国官网:购买五颜六色的袜子
2020/11/03 全球购物
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
机械专业应届生求职信
2013/09/21 职场文书
高二美术教学反思
2014/01/14 职场文书
房地产财务部员工岗位职责
2014/03/12 职场文书
付款委托书范本
2014/04/04 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
单位婚育证明范本
2014/11/21 职场文书
未婚证明范本
2015/06/15 职场文书
贷款收入证明格式
2015/06/24 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
MySQL Router的安装部署
2021/04/24 MySQL
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript