认识延迟时间为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 相关文章推荐
showModelessDialog()使用详解
Sep 21 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
Sep 08 Javascript
jQueryUI如何自定义组件实现代码
Nov 14 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
Sep 29 Javascript
jQuery获取父元素及父节点的方法小结
Apr 14 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
May 10 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
Feb 22 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
Jan 11 Javascript
对vue.js中this.$emit的深入理解
Feb 23 Javascript
Vue瀑布流插件的使用示例
Sep 19 Javascript
详解vuex状态管理模式
Nov 01 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
Jul 19 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的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
php对象工厂类完整示例
2018/08/09 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
Javascript 实现全屏滚动实例代码
2016/12/31 Javascript
Javascript 使用ajax与C#获取文件大小实例详解
2017/01/13 Javascript
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
2019/04/29 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
python增加矩阵维度的实例讲解
2018/04/04 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
浅析Python3 pip换源问题
2020/01/06 Python
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
请说出以下代码输出什么
2013/08/30 面试题
办公室前台岗位职责范本
2013/12/10 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
搞笑老公保证书
2015/02/26 职场文书
法人代表证明书范本
2015/06/18 职场文书
婚宴新娘致辞
2015/07/28 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
SQL Server 数据库实验课第五周——常用查询条件
2021/04/05 SQL Server
Python实现文字pdf转换图片pdf效果
2022/04/03 Python