有效的捕获JavaScript焦点的方法小结


Posted in Javascript onOctober 08, 2009

1. 设置元素可获得焦点以监听键盘事件
元素聚焦最大好处就是可允许发送键盘事件,HTML很多元素默认就有可聚焦,如form表单元素,a锚链接等,但大部份默认是不能聚焦的。要使得元素能够聚焦,可以在HTML代码或JavaScript脚本中实现。
html:

<div tabIndex="0" style="height:100px;width:100px; background:red;"></div>

JavaScript:
oDiv.tabIndex = 0;
其中tabIndex是TAB键的导航顺序,可有正,负或零。
当元素获得焦点时会有边框指示,如果想不显示这个边框,可以
html:
<div tabIndex="0" hidefocus="on" ></div>

JavaScript:
oDiv.hideFocus = ‘on';
2. 元素明明设置了聚焦却没效果
有时用JavaScript设置了元素聚焦,但最后焦点却不落在该元素上,百思不得其解。
问题在于如果在可焦点元素的事件处理函数中聚焦其它元素,就有可能聚不了焦点,因为如果该事件是个可获得焦点的事件,如mouse, keydow(keypress)等等,在这些事件的处理函数内直接聚焦其它元素是失败的。
oDiv.onmousedown = function(){ 
document.getElementById('ipt').focus(); 
};

参考浏览器内核处理流程图:
有效的捕获JavaScript焦点的方法小结
当浏览器第一次Reflow回流后,焦点停在另一个元素上,但回流返回后,事件处理后默认的操作将继续执行,那就是聚焦到事件源,也就是mousedown的元素,这时引发第二次回流,当回流后焦点聚在该元素上.所以在事件处理函数中的聚焦变得无效.

有没解决方法? 答案是肯定的. 由图可知,只要把聚焦放到第二个Reflow回流之后执行即可.这个可利用setTimeout方法作延迟先放进队列等后再执行.因为由于JavaScript引擎单线程特性,图上整个过程都是连着执行的,该过程中JS引擎一直没有空闲过,当上面所有操作都完成后并后,定时回调才有机会被执行.所以可以:

oDiv.onmousedown = function(){ 
setTimeout(function(){ 
document.getElementById('ipt').focus(); 
}, 0); 
};

由上可知,最后那个毫秒数即使设为0也没关系.

3. 聚焦时抛出异常的
在IE中,当元素不可见时如果聚焦的话,会抛出一个异常,因为在很多应用中我们往往不再对元素是否不可见作测试就聚焦了,因为即使这样也没什么问题(谁说不可见元素就不可以聚焦的?)..所以,在IE下可用try{}catch(){}来忽略这个异常.

try{ 
element.focus(); 
}catch(e){}

到此,与JavaScript焦点捕获相关的问题讨论就完成了.
Javascript 相关文章推荐
JScript 脚本实现文件下载 一般用于下载木马
Oct 29 Javascript
javascript 拖放效果实现代码
Jan 22 Javascript
为你的网站增加亮点的9款jQuery插件推荐
May 03 Javascript
JavaScript实现简单的时钟实例代码
Nov 23 Javascript
javascript闭包的理解
Apr 01 Javascript
javascript框架设计之类工厂
Jun 23 Javascript
基于JavaScript获取鼠标位置的各种方法
Dec 16 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
Jan 14 Javascript
JQuery解析XML数据的几个简单实例
May 18 Javascript
js中class的点击事件没有效果的解决方法
Oct 13 Javascript
Bootstrap表单制作代码
Mar 17 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
May 30 Javascript
Javascript isArray 数组类型检测函数
Oct 08 #Javascript
JavaScript 监听textarea中按键事件
Oct 08 #Javascript
jquery 最简单的属性菜单
Oct 08 #Javascript
Javascript 日期处理之时区问题
Oct 08 #Javascript
学习ExtJS table布局
Oct 08 #Javascript
学习ExtJS accordion布局
Oct 08 #Javascript
学习ExtJS form布局
Oct 08 #Javascript
You might like
php strtotime 函数UNIX时间戳
2009/01/14 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
php的扩展写法总结
2019/05/14 PHP
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
2013/12/19 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
微信小程序实现topBar底部选择栏效果
2018/07/20 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
python将图片文件转换成base64编码的方法
2015/03/14 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
python和opencv实现抠图
2018/07/18 Python
python使用tornado实现简单爬虫
2018/07/28 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
pytorch索引查找 index_select的例子
2019/08/18 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
《荷花》教学反思
2014/04/16 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
环保专项行动方案
2014/05/12 职场文书
毕业生求职信范文
2014/06/29 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
学生会任命书范本
2015/09/21 职场文书
创业计划书之物流运送
2019/09/17 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript
详解如何使用Nginx解决跨域问题
2022/05/06 Servers