有效的捕获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 相关文章推荐
javascript flash下fromCharCode和charCodeAt方法使用说明
Jan 12 Javascript
Jquery从头学起第四讲 jquery入门教程
Aug 01 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
Html5的placeholder属性(IE兼容)实现代码
Aug 30 Javascript
面向切面编程(AOP)的理解
May 01 Javascript
聊一聊JS中的prototype
Sep 29 Javascript
微信公众号支付H5调用支付解析
Nov 04 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
Nov 07 Javascript
js实现五星评价功能
Mar 08 Javascript
JS实现的随机排序功能算法示例
Jun 09 Javascript
VUE引入第三方js包及调用方法讲解
Mar 01 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
Jul 24 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中路径问题的解决方案
2006/10/09 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
JS控制表格隔行变色
2006/06/26 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
轻量级JS Cookie插件js-cookie的使用方法
2018/03/22 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
微信跳一跳游戏python脚本
2020/04/01 Python
Python实现k-means算法
2018/02/23 Python
django Serializer序列化使用方法详解
2018/10/16 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
培训主管岗位职责
2014/02/01 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
离婚纠纷代理词
2015/05/23 职场文书
如何写观后感
2015/06/19 职场文书
公司酒会主持词
2015/07/02 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书
Python Parser的用法
2021/05/12 Python
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
Python语言规范之Pylint的详细用法
2021/06/24 Python