有效的捕获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 相关文章推荐
document.all与WEB标准
May 13 Javascript
JS 判断代码全收集
Apr 28 Javascript
基于jquery的拖动布局插件
Nov 25 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
Dec 26 Javascript
Jquery之Bind方法参数传递与接收的三种方法
Jun 24 Javascript
js中document.write的那点事
Dec 12 Javascript
jquery仅用6行代码实现滑动门效果
Sep 07 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
Sep 14 Javascript
BootStrap实现树形目录组件代码详解
Jun 21 Javascript
JS本地刷新返回上一页代码
Jul 25 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
Sep 06 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
Jan 21 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学习之数组的定义和填充
2011/04/17 PHP
百度站点地图(百度sitemap)生成方法分享
2014/01/09 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
基于node.js的快速开发透明代理
2010/12/25 Javascript
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
全面理解面向对象的 JavaScript(来自ibm)
2013/11/10 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
Python3写入文件常用方法实例分析
2015/05/22 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
学生会竞选自荐信
2013/10/12 职场文书
个人函授自我鉴定
2014/03/25 职场文书
2014各大专业毕业生自我评价
2014/09/17 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers