打印

SD9027: 各浏览中某些标记通过鼠标触发 Click 事件后不会获得焦点并触发 Focus 事件

作者:钱宝坤

标准参考

根据 W3C HTML4.01 规范中的描述,onFocus 是 HTML 中的标准属性,它在元素通过鼠标或者键盘 TAB 导航获得焦点时触发,一般应用在 A、AREA、LABEL、INPUT、SELECT、TEXTAREA、BUTTON 元素上。此事件不冒泡。

根据 W3C DOM Level 2 (HTML) 规范中的描述,HTMLSelectElement、HTMLInputElement、HTMLTextAreaElement、HTMLAnchorElement 这几个接口(对应 HTML 标签为 SELECT、INPUT、TEXTAREA、A)存在 Focus() 方法,此方法可以使当前元素获得键盘焦点。

关于 Focus 的更多资料,请参见 HTML4.01 规范 18.2.3 Intrinsic events、DOM Level 2 (HTML) 规范 1.6.5. Object definitions、DOM Level 2 (Event) 规范 1.6.5. HTML event types 中的内容。

其中 W3C DOM Level 2 (Event) 和 HTML4.01 这两个规范在 Focus 事件的可触发元素说明存在不一致。

W3C DOM Level 2 (Event) 规范中说明可以触发 Focus 事件的元素为 LABEL, INPUT, SELECT, TEXTAREA, BUTTON 之外,而在 HTML 4.01 规范中还存在 A 和 AREA 元素。

另外,在用户单击某元素时,会触发一系列相关事件发生,他们的执行顺序为 MouseDown、MouseUp、Click,相关说明请参照 DOM-Level-2-Events 规范 1.6.2. Mouse event types 中的 click 部分。

问题描述

在用户通过鼠标操作触发 click 事件时,基本的事件触发流程为:MouseDown 事件 --> MouseUp 事件 --> Click 事件。

如果用户点击的元素可以获得焦点,并且当前还没有获得焦点时,会在 MouseUp 事件前先触发 Focus 事件,再依次触发其后事件。

此时就会出现问题,如果被点击的元素无法通过点击操作获得焦点,则 Focus 事件不会被触发,他的事件函数也不会因点击操作而运行,这就有可能导致功作者设计的功能无法按预期效果执行。

造成的影响

当页面开发者将关键事件处理程序放置到 Focus 事件中,并期望使用鼠标单击操作触发 Focus 事件内处理函数时,可能会导致无法触发相应事件。

受影响的浏览器

所有浏览器

问题分析

根据相关事件规范说明,一般情况下可以触发 Focus 事件的元素为 A, AREA, LABEL, INPUT, SELECT, TEXTAREA, BUTTON,它们均可使用设备指针(鼠标)和 TAB 键切换到相应的元素标签上,并触发焦点事件。

实际上各个浏览器对使用设备指针触发的 Focus 事件处理情况不一,我们将常用 HTML 标签依次绑定 click 和 Focus 事件监听处理函数,依次点击各个标签元素,在右侧的事件信息框中观察执行情况。

由于相关的测试代码较多,故不在页面上展示,具体代码请参见页面底部测试页面部分。

汇总测试程序数据,可得出各浏览器运行结果表,如下:

click 标记是否可以获得焦点 IE6 IE7 IE8 Firefox Chrome Safari Opera
A
AREA
LABEL
INPUT[type=text]
INPUT[type=password]
SELECT TEXTAREA
BUTTON
INPUT[type=radio]
INPUT[type=checkbox]
INPUT[type=button]
INPUT[type=submit]
EMBED
IFRAME
TABLE CAPTION TD
FIELDSET
其他 HTML 元素 1

注 1:这些 HTML 元素包括: TD DIV SPAN CODE LEGEND TBODY TFOOT THEAD ABBR ACRONYM ADDRESS B BDO BIG BLOCKQUOTE CENTER CITE DD DEL DIR DFN DL DT EM FONT FORM H1 H2 H3 H4 H5 H6 I INS INS KBD LI MENU OL OBJECT P PRE Q S SAMP SMALL STRIKE STRONG SUB SUP TH TR TT U UL VAR。

可以看到各浏览器对于 A AREA BUTTON INPUT SELECT TEXTAREA EMBED IFRAME TABLE CAPTION TD FIELDSET 这几个元素,通过设备指针(鼠标)的点击操作时触发 Focus 事件的情况,在实现中存在差异。

解决方案

  • 只在 INPUT[type=text] INPUT[type=password] SELECT TEXTAREA 元素中,使用 Focus 事件替代 click 事件触发相关业务逻辑处理程序。
  • 其他标记中的 Focus 事件无法使用鼠标指针的 click 操作触发,仅能通过 TAB 键切到可触发 Focus 事件的元素中才会生效。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6.8
Chrome 7.0.517.0 dev
Safari 5.0.1
Opera 10.61
测试页面: click_and_Focus.html
本文更新时间: 2010-09-03

关键字

A AREA BUTTON INPUT SELECT TEXTAREA EMBED IFRAME TABLE CAPTION TD FIELDSET CLICK Focus 鼠标 点击 焦点