有效的捕获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 动态创建VML的方法
Oct 14 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
Oct 29 Javascript
Javascript页面添加到收藏夹的简单方法
Aug 07 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
Nov 08 Javascript
AngularJS 模型详细介绍及实例代码
Jul 27 Javascript
实现easyui的datagrid导出为excel的示例代码
Nov 10 Javascript
ES6下React组件的写法示例代码
May 04 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
Oct 18 Javascript
vue中实现methods一个方法调用另外一个方法
Feb 08 Javascript
vue和webpack打包项目相对路径修改的方法
Jun 15 Javascript
vscode中vue-cli项目es-lint的配置方法
Jul 30 Javascript
解决vue.js提交数组时出现数组下标的问题
Nov 05 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 向访客和爬虫显示不同的内容
2009/11/09 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
2015/12/19 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
js简单抽奖代码
2015/01/16 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
jQuery Ajax 实现在html页面实时显示用户登录状态
2016/12/30 Javascript
微信小程序 两种为对象属性赋值的方式详解
2017/02/23 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
webpack开发跨域问题解决办法
2017/08/03 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
详解如何在React组件“外”使用父组件的Props
2018/01/12 Javascript
深入理解node.js http模块
2018/01/24 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
一百行python代码将图片转成字符画
2021/02/19 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
网吧收银员岗位职责
2013/12/14 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
花坛标语大全
2014/06/30 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书
修辞手法有哪些?
2019/08/29 职场文书