有效的捕获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 相关文章推荐
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
Aug 13 Javascript
js页面跳转常用的几种方式
Nov 25 Javascript
使用JavaScript获取电池状态的方法
May 03 Javascript
Javascript中this的用法详解
Sep 22 Javascript
javascript精确统计网站访问量实例代码
Dec 19 Javascript
javascript函数自动执行常用方法汇总
Mar 28 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
Mar 13 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
Aug 31 Javascript
JS实现调用本地摄像头功能示例
May 18 Javascript
JS中Promise函数then的奥秘探究
Jul 30 Javascript
Vue.js实现可排序的表格组件功能示例
Feb 19 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
Feb 26 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
处理php自动反斜杠的函数代码
2010/01/05 PHP
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
UpdatePanel和Jquery冲突的解决方法
2013/04/01 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
微信小程序实战之上拉(分页加载)效果(2)
2017/04/17 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
Python用zip函数同时遍历多个迭代器示例详解
2016/11/14 Python
Python并发之多进程的方法实例代码
2018/08/15 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
本科生职业生涯规划书范文
2014/01/21 职场文书
关于工作经历的证明书
2014/10/11 职场文书
简单租房协议书
2014/10/21 职场文书
2014会计年终工作总结
2014/12/20 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
详细介绍Java中的CyclicBarrier
2022/04/13 Java/Android