有效的捕获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 静态页面实现随机显示广告的办法
Nov 17 Javascript
js获取当前月的第一天和最后一天的小例子
Nov 18 Javascript
javascript的document.referrer浏览器支持、失效情况总结
Jul 18 Javascript
javascript实现图片自动和可控的轮播切换特效
Apr 13 Javascript
浅谈Jquery核心函数
Jun 18 Javascript
JavaScript iframe数据共享接口实现方法
Jan 06 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
May 17 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
Aug 29 Javascript
JS实现的哈夫曼编码示例【原始版与修改版】
Apr 22 Javascript
vuejs实现标签选项卡动态更改css样式的方法
May 31 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
Oct 08 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
Oct 19 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伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
使用正则替换变量
2007/05/05 Javascript
Javascript 跨域访问解决方案
2009/02/14 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
Jquery Ajax Error 调试错误的技巧
2015/11/20 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
详解vue中axios请求的封装
2019/04/08 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
Python流程控制常用工具详解
2020/02/24 Python
国际贸易专业个人鉴定
2014/02/22 职场文书
活动总结怎么写
2014/04/28 职场文书
企业领导对照检查材料
2014/08/20 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
Python实战之实现康威生命游戏
2021/04/26 Python
如何在Python项目中引入日志
2021/05/31 Python
nginx配置之并发频次限制
2022/04/18 Servers
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS