有效的捕获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 相关文章推荐
JS效率个人经验谈(8-15更新),加入range技巧
Jan 09 Javascript
DHTML Slide Show script图片轮换
Mar 03 Javascript
javascript中[]和{}对象使用介绍
Mar 20 Javascript
js中substring和substr的详细介绍与用法
Aug 29 Javascript
基于jQuery仿淘宝产品图片放大镜特效
Oct 19 Javascript
深入理解setTimeout函数和setInterval函数
May 20 Javascript
Node.js包管理器Yarn的入门介绍与安装
Oct 17 Javascript
微信小程序 scroll-view隐藏滚动条详解
Jan 16 Javascript
JavaScript中数组Array方法详解
Feb 27 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
Oct 18 Javascript
如何理解Vue的v-model指令的使用方法
Jul 19 Javascript
判断js数据类型的函数实例详解
May 23 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与SQL注入攻击防范小技巧
2011/09/16 PHP
eaglephp使用微信api接口开发微信框架
2014/01/09 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
Extjs学习笔记之四 工具栏和菜单
2010/01/07 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
jquery map方法使用示例
2014/04/23 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
微信小程序实现选项卡功能
2020/06/19 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
微信小程序音乐播放器开发
2019/11/20 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
python单例模式实例分析
2015/04/08 Python
Python批量修改文本文件内容的方法
2016/04/29 Python
Python正则简单实例分析
2017/03/21 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
货代行业个人求职简历的自我评价
2013/10/22 职场文书
物流仓管员岗位职责
2013/12/04 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
靠谱的活动总结
2019/04/16 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
进行数据处理的6个 Python 代码块分享
2022/04/06 Python
SpringBoot深入分析讲解监听器模式下
2022/07/15 Java/Android