有效的捕获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英文日期(有时间)选择器
May 02 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
May 07 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
Dec 31 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
Jun 12 Javascript
AngularJS Ajax详解及示例代码
Aug 17 Javascript
JS命令模式例子之菜单程序
Oct 10 Javascript
浅谈js键盘事件全面控制
Dec 01 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
Apr 29 Javascript
layer.open的自适应及居中及子页面标题的修改方法
Sep 05 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
Mar 17 Javascript
js模拟实现百度搜索
Jun 28 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
GD输出汉字的函数的分析
2006/10/09 PHP
PHP 定界符 使用技巧
2009/06/14 PHP
php使用session二维数组实例
2014/11/06 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
JS中精巧的自动柯里化实现方法
2017/12/12 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
理解JavaScript中的Proxy 与 Reflection API
2020/09/21 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
Python的类实例属性访问规则探讨
2015/01/30 Python
python删除列表内容
2015/08/04 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
html5各种页面切换效果和模态对话框用法总结
2014/12/15 HTML / CSS
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
银行门卫岗位职责
2013/12/29 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
学院党的群众路线教育实践活动整改方案
2014/10/04 职场文书
怎样写辞职信
2015/02/27 职场文书
2015年组织部工作总结
2015/04/03 职场文书
2015年成本会计工作总结
2015/10/14 职场文书