有效的捕获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 Array扩展实现代码
Oct 14 Javascript
Firefox中beforeunload事件的实现缺陷浅析
May 03 Javascript
禁止页面刷新让F5快捷键及右键都无效
Jan 22 Javascript
JavaScript避免内存泄露及内存管理技巧
Sep 05 Javascript
javascript判断复选框是否选中的方法
Oct 16 Javascript
使用React实现轮播效果组件示例代码
Sep 05 Javascript
JS实现动画兼容性的transition和transform实例分析
Dec 13 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
Jan 04 Javascript
js 实现复选框只能选择一项的示例代码
Jan 23 Javascript
vue-cli axios请求方式及跨域处理问题
Mar 28 Javascript
微信小程序位置授权处理方法
Jun 13 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
Apr 03 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
桌面中心(二)数据库写入
2006/10/09 PHP
数字转英文
2006/12/06 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
2020/12/29 PHP
如何取得中文输入的真实长度?
2006/06/24 Javascript
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
VUE-cli3使用 svg-sprite-loader
2018/10/20 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
Python数据分析库pandas基本操作方法
2018/04/08 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
python实现简单加密解密机制
2019/03/19 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
python操作cfg配置文件方式
2019/12/22 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
canvas与html5实现视频截图功能示例
2016/12/15 HTML / CSS
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
美国嘻哈文化生活方式品牌:GLD
2018/04/15 全球购物
家长给小学生的评语
2014/01/30 职场文书
建筑工地文明标语
2014/10/09 职场文书
初中家长评语和期望
2014/12/26 职场文书
2016全国“质量月”活动标语口号
2015/12/26 职场文书
React更新渲染原理深入分析
2022/12/24 Javascript