认识延迟时间为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 相关文章推荐
window.showModalDialog使用手册
Jan 11 Javascript
理解Javascript_14_函数形式参数与arguments
Oct 20 Javascript
JavaScript Serializer序列化时间处理示例
Jul 31 Javascript
JS建造者模式基本用法实例分析
Jun 30 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
Oct 10 Javascript
js时间查询插件使用详解
Apr 07 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
Jul 05 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
Aug 11 Javascript
微信小程序倒计时功能实现代码
Nov 09 Javascript
在Vue项目中使用d3.js的实例代码
May 01 Javascript
JavaScript基于用户照片姓名生成海报
May 29 Javascript
Vue3中的Refs和Ref详情
Nov 11 Vue.js
用函数式编程技术编写优美的 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全局变量和类配合使用深刻理解
2013/06/05 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
php使用正则验证中文
2016/04/06 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
2017/01/12 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
Python生成随机密码
2015/03/10 Python
Python2.7编程中SQLite3基本操作方法示例
2017/08/09 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
Python列表list排列组合操作示例
2018/12/18 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
Python运行异常管理解决方案
2020/03/09 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
初中考试作弊检讨书
2014/02/01 职场文书
售房协议书
2014/08/19 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书