认识延迟时间为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的replace()方法查找字符示例代码
Oct 28 Javascript
js截取字符串的两种方法及区别详解
Nov 05 Javascript
用unescape反编码得出汉字示例
Apr 24 Javascript
深入理解JS中的substr和substring
Apr 26 Javascript
使用angular帮你实现拖拽的示例
Jul 05 Javascript
基于jquery.page.js实现分页效果
Jan 01 jQuery
浅谈vue单一组件下动态修改数据时的全部重渲染
Mar 01 Javascript
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
Oct 02 Javascript
浅谈layui分页控件field参数接收对象的问题
Sep 20 Javascript
vue路由跳转传递参数的方式总结
May 10 Javascript
vue实现几秒后跳转新页面代码
Sep 09 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数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
php switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
深入php内核之php in array
2015/11/10 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
PHP xpath()函数讲解
2019/02/11 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
vue+iview+less 实现换肤功能
2018/08/17 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
python 图片验证码代码
2008/12/07 Python
Python脚本实现网卡流量监控
2015/02/14 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
django和flask哪个值得研究学习
2020/07/31 Python
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
解释下面关于J2EE的名词
2013/11/15 面试题
银行会计业务的个人自我评价
2013/11/02 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
师范生小学见习总结
2015/06/23 职场文书
世界名著读书笔记
2015/06/25 职场文书
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL