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 鼠標 點擊 焦點


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章