有效的捕获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使用setTimeout实现延迟弹出警告框的方法
Apr 07 Javascript
举例讲解AngularJS中的模块
Jun 17 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
Sep 11 Javascript
jQuery 跨域访问解决原理案例详解
Jul 09 Javascript
JavaScript常用代码书写规范的超全面总结
Sep 11 Javascript
javascript数组遍历的方法实例分析
Sep 13 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
Oct 26 Javascript
微信小程序 获取二维码实例详解
Jun 23 Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
Oct 24 Javascript
Element UI框架中巧用树选择器的实现
Dec 12 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
浅谈php自定义错误日志
2015/02/13 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
React Native之TextInput组件解析示例
2017/08/22 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
Python的Django框架中的数据库配置指南
2015/07/17 Python
python实现聊天小程序
2018/03/13 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Python Merge函数原理及用法解析
2020/09/16 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
大学生职业生涯规划书范文
2014/01/04 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
2015新员工工作总结范文
2015/10/15 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
导游词之神仙居景区
2019/11/15 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers