HTML焦点与键盘事件

所谓焦点就是用户当前正在操作的对象,可以是某个元素,也可能是某个浏览器中的tab或window。比如用鼠标点击输入框,那么输入框就会成为焦点。使用键盘上的Tab键,又可以把焦点转移到另外一个元素或浏览器的其他区域。通过鼠标和键盘都可以转移焦点,甚至编辑焦点元素。

焦点元素

同一时间一个document只能有一个元素成为焦点,这个焦点元素可以使用JavaScript访问:

document.activeElement;

如果没有元素成为焦点,默认是body元素作为activeElement。成为焦点的元素对应CSS的:focus伪类。

但不是所有元素都可以成为焦点,只有拥有可获焦区域的DOM锚才可以称为焦点:

可获焦区域

可获焦区域可能是元素,元素的部分或用户代理管理的其他部分,每一个可获焦区域有一个DOM锚,这个锚是一个Node对象,Node对象的位置就是可获焦区域在DOM中的位置。可获焦区域的API目前就通过这个锚来操作可获焦区域。

不是所有Node都能表示焦点区域,Node要变成焦点区域需要满足一些条件。下表只是列出了一些常见的可获焦区域和它的DOM锚:


可获焦区域


DOM锚


有tabindex焦点标志,并且没有disabled属性的元素


元素本身


Image map中area的图形区域


img元素


用户代理提供的可获焦子控件,比如input[type=number]生成的上下两个按钮


生成子控件的元素


元素的滚动区域


产生滚动区域的元素


浏览上下文内document的viewport,比如iframe产生的视窗。


为之产生viewport的document

tabindex焦点标记

使用键盘上的tab键,可以按顺序切换当前焦点元素,而影响这个切换顺序的属性就是元素的tabindex属性。这个属性的取值范围是0到32767,如果赋值为负数则表示没有焦点标记,不对它进行切换。

但并不是所有元素设置了tabindex就一定可以使用tab键切换成为焦点,首先tabindex的值不能为负数,而且不能有disabled属性。另外,这个元素必须有对应的可获焦区域,而且支持tabindex属性。HTML4规定FORM表单中只有以下元素支持tabindex属性:a、area、button、input、object、select、textarea。

没有显式设置tabindex属性的元素就不能通过Tab键切换成为焦点?也不是,只要元素拥有tabindex焦点标记就可以。W3C推荐用户代理自动为以下元素设置tabindex焦点标记:

  • 有href属性的a元素;
  • 有href属性的link元素;
  • button元素;
  • type不是hidden的input元素;
  • select元素;
  • textarea元素;
  • iframe、frame元素;
  • menuitem元素;
  • 设置了draggable属性的元素;
  • 设置了contenteditable属性的元素;

默认这些元素的tabindex为0。以上只是W3C推荐的元素,不同的浏览器实现可能不一样。比如在Chrome41中,如果不是上述元素,即使设置了合法的tabindex也不会被tab键切换到,而在IE和Firefox中,只要设置了合法的tabindex就可以被tab切换到。

切换顺序规则

由先到后的顺序是:

1.        元素的tabindex大于0的元素,按tabindex从小到大顺序切换;

2.        元素的tabindex相同的,按元素在document中的出现顺序切换;

3.        元素的tabindex为0,或没有设置tabindex,或tabindex不是有效整数(后两种等同于tabindex=0),按元素在document中的出现顺序切换;

focus & focusin, blur & focusout

一个元素成为active元素就等于获得了焦点,会触发这个元素的focus事件。有元素获得焦点,一般就有元素会失去焦点,失去焦点的元素触发blur事件。这两个事件几乎是同时发生的,但他们的执行顺序有区别,blur事件的监听方法先执行,然后才是focus事件的监听方法。

元素在document没有加载完之前是不能获得焦点的,获得焦点的元素通过documnt.activeElement可以访问。

Focusin也是元素在即将获取焦点的时候触发的事件,它和focus的主要区别是focus事件没有冒泡阶段。因为focusin事件有冒泡阶段,因此可以用来监听本元素及其子元素获取焦点的情况。同理,blur事件也没有冒泡阶段,而focusout有。

兼容性:

  • Firefox不支持focusin和focusout事件;
  • Chrome,获取焦点执行顺序:onfocus,onfocusin;失去焦点执行顺序:onblur, onfocusout。
  • IE6,IE7,IE8,IE9,IE10,获取焦点执行顺序:onfocusin ,onfocus;失去焦点执行顺序:onfocusout ,onblur。

键盘事件

在DOM中,有几个键盘事件总是以获得焦点的元素作为目标的。

Keypress, keydown, keyup的区别

KeyPress主要用来接收字母、数字等ANSI字符,而 KeyDown 和 KeyUP 事件过程可以处理任何不被KeyPress 识别的击键,诸如:功能键(F1-F12)、编辑键、定位键以及任何这些键和键盘换档键的组合等。

三个事件的触发顺序按从早到晚:keydown、keypress、keyup。Keydown和keypress事件监听方法执行的时候,刚才敲入的字符还没有显示在输入框中,要等这些事件监听方法执行完后才插入。Keyup事件监听方法执行的时候,字符已经显示在输入框中。

如果摁住某个键不放,会间隔触发keypress和keydown事件,但只要你不放开,就不会触发keyup,keyup只有当你放开这个键才会触发。

时间: 2024-10-03 10:55:09

HTML焦点与键盘事件的相关文章

jQuery键盘事件 ctrl+Enter回车键提交表单

分享下jquery键盘事件的一些例子,个人感觉还不错,有空时多多研究. 键盘事件处理所有用户在键盘敲击的情况,不管在文本输入区域内部还是外部.键盘事件在不同的浏览器中作用的范围是不一样的,通常这种键盘事件可以作用于 Form元素,a标签元素,window ,document这样的元素上.在所有可以获得交点的元素上是可以触发键盘事件的,可以获得焦点的元素可以这样理解,在使用Tab键的时候可以跳跃到的元素就是可以使用键盘事件的元(在没有为这些元素设置tabindex属性值的情况下,当tabindex

QWidget 键盘事件 焦点(QApplication源码)

在Qt中,键盘事件和QWidget的focus密不可分:一般来说,一个拥有焦点(focus)的QWidget或者grabKeyboard()的QWidget才可以接受键盘事件. 键盘事件派发给谁? 如何确定谁来接收键盘事件,不妨看一点点QApplication的源码: X11下 QETWidget *keywidget=0; bool grabbed=false; if (event->type==XKeyPress || event->type==XKeyRelease) { keywidg

Qt中的键盘事件,以及焦点的设置(比较详细)

Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效.下面关注点在按键特有的部分: focus 一个拥有焦点(focus)的QWidget才可以接受键盘事件.有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等. 焦点移动的方式有以下几种: 按下Tab或Shift+Tab 注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等 Qt中,需要输入Tab的地方可以用 Ctrl+Tab 或 Ctrl+Shift+Tab 替代. 点击一个QWidg

js键盘事件和焦点事件

键盘事件onkeydown //当键盘按下的时候触发onkeyup //但键盘抬起的时候触发event.keyCode //数字类型 键盘按键的键值功能键 ctrlkey shiftkey altkey //返回的是布尔值 不是所有元素都能接收键盘事件,能够响应用户输入的元素,能够坚守焦点的元素就能接收键盘事件 document是可以接收键盘事件的 焦点:使浏览器能够区分用户输入的对象:当一个元素有焦点的时候,那么他就可以接收用户的输入.我们可以通过一些方式给元素设置焦点 1 点击 2 tab键

键盘事件相关

转自下面两个链接:http://www.cnblogs.com/starof/p/6558581.html   http://www.cnblogs.com/cathsfz/archive/2011/05/29/2062382.html 在 JavaScript 中监听 IME 键盘输入事件 在 JavaScript 中监听用户的键盘输入是很容易的事情,但用户一旦使用了输入法,问题就变得复杂了.输入法应当如何触发键盘事件呢?是每一下击键都触发一次事件,还是选词完毕才触发事件呢?整句输入又该如何触

JS_DOM_鼠标、键盘事件合集

JS_DOM_鼠标.键盘事件合集 鼠标事件 onclick         鼠标点击事件 ondblclick          鼠标双击事件 onmousedown 鼠标按下事件 onmouseup       鼠标按键被松开事件 onmouseenter        鼠标指针移上时出发事件(不支持冒泡) onmouseleave        鼠标指针移出事件 onmousemove 鼠标移动事件 onmouseover     鼠标移入事件(移入子元素也会触发) onmouseout  

转:总结Selenium WebDriver中一些鼠标和键盘事件的使用

在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作.在 WebDeriver 中,有一个专门的类来负责实现这些测试场景,那就是 Actions 类,在使用该类的过程中会配合使用到 Keys 枚举以及 Mouse. Keyboard.CompositeAction 等类. 其次,在实际测试过程中,可能会遇到某些按键没办法使用 Actions.Keys 等类来

Javascript 事件对象(六)键盘事件

keyCode获取用户按下键盘的哪个按键 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 5 <title>无标题文档</title> 6 <script> 7 /* 8 onkeydown : 当键盘按键按下的时候触发

jQuery基础(鼠标事件,表单事件,键盘事件,自定义事件 篇)

1.jQuery鼠标事件之click与dbclick事件 方法一:$ele.click()(不带参数) <div id="test">点击触发<div> $("ele").click(function(){ alert('触发指定事件') }) $("#test").click(function(){ $("ele").click() //手动指定触发事件 });   方法二:$ele.click( h