认识延迟时间为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展开闭合效果演示代码
Jul 24 Javascript
JavaScript语言对Unicode字符集的支持详解
Dec 30 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
Feb 18 Javascript
JavaScript实现复制文章自动添加版权
Aug 02 Javascript
浅析location.href跨窗口调用函数
Nov 22 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
Feb 14 Javascript
jQuery实现键盘回车搜索功能
Jul 25 jQuery
vue-cli3脚手架的配置及使用教程
Aug 28 Javascript
ng-events类似ionic中Events的angular全局事件
Sep 05 Javascript
Vue全局loading及错误提示的思路与实现
Aug 09 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
Feb 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统一页面编码避免乱码问题
2015/04/09 PHP
PHP实现将textarea的值根据回车换行拆分至数组
2015/06/10 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
js 中 document.createEvent的用法
2010/08/29 Javascript
浅析Prototype的模板类 Template
2011/12/07 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
Django学习教程之静态文件的调用详解
2018/05/08 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
python turtle库画一个方格和圆实例
2019/06/27 Python
python scatter函数用法实例详解
2020/02/11 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
Jacques Lemans德国:奥地利钟表品牌
2019/12/26 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
口腔医学技术应届生求职信
2013/11/09 职场文书
日语专业推荐信
2013/11/12 职场文书
建筑设计师岗位职责
2013/11/18 职场文书
法人代表证明书
2014/09/18 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
诉讼授权委托书
2014/10/15 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript
Vue通过懒加载提升页面响应速度
2021/05/10 Vue.js
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python