DOM Level 3 Events: DOM事件架構(2-2)

李鬆峰發表於2011-10-30

摘譯自:Document Object Model (DOM) Level 3 Events Specification

3.4 可信任事件

使用者代理生成的事件對使用者代理而言是可信任的,不管該事件是因使用者互動生成的,還是因修改DOM引起的。可信任的事件具有優先權,而指令碼通過DocumentEvent.createEvent("Event")方法生成的事件、通過Event.initEvent()方法修改的事件,或者通過EventTarget.dispatchEvent()方法分派的事件都不具有優先權。可信任事件的isTrusted屬性的值為true,而不可信任事件的isTrusted屬性值為false。

不可信任事件通常不應當觸發預設動作,但click或DOMActivate事件是例外,因為它們已經被合成(synthesized),並且由使用者代理作為活動觸發器預設動作來管理。(詳細內容請參見“3.5 活動觸發器和行為”);使用者代理管理的這些已合成的事件的isTrusted屬性值為false,但仍然可以觸發預設動作。而其他任何不可信任事件的行為都應當像是在這些事件上呼叫了Event.preventDefault()方法一樣。

出於安全方面的考慮,宿主語言不應該定義不可取消的事件(參見“3.2 預設動作與可取消的事件”),但也可以有預設動作*,因為這些預設動作可能會被不可信任的事件觸發。

3.5 活動觸發器和行為

某些最近事件目標(例如連結或按鈕元素)可以有關聯的活動行為(例如開啟連結),由實現在響應活動觸發器(例如單擊連結)時執行。

宿主語言應該指出哪些元素有活動行為,描述適當的活動觸發器,並且定義該活動行為的結果。支援宿主語言的實現應該在關聯的活動觸發器啟用時觸發這些活動行為

例子:HTML和SVG都有一個表示連結的a元素。與a元素關聯的活動觸發器是在a元素包含的文字或影像內容上單擊產生的click事件,或者在a元素獲得焦點時(按下Enter鍵)產生的key屬性值為"Enter"鍵的keydown事件。正常情況下,對於外部連結,a元素的活動行為是把視窗的內容改變為新文件的內容,對於內部連結,a元素的活動行為是相對於新的錨點重新定位文件。

活動觸發器就是某種使用者操作,或者某種向實現表明應該觸發某種活動行為的事件。使用者啟用的活動觸發器包括在可單擊元素上單擊滑鼠鍵、在可啟用元素擁有焦點時按下Enter鍵,或者在某可啟用元素沒有獲得焦點的情況下,按下連線到該元素的鍵(如“熱鍵”或“訪問鍵”)。基於事件的活動觸發器可以包含基於計時器的事件,從而在某個時間點或經過一段時間後啟用元素,在某個動作完成後處理事件,或者包含其他基於條件或基於狀態的事件。

在某些情況下,宿主語言可以定義屬性甚至屬性值,以便新增或修改元素原生的活動觸發器活動行為。例如,為了增強無障礙性,ARIA為role屬性定義了值,從而為應用該值的元素新增語義。在這種情況下,如果宿主語言未明確定義活動觸發器活動行為,內容作者必須(通過事件監聽器)為應用相應屬性或屬性值的元素提供活動觸發器機制(例如呼叫ECMAScript函式)。

3.5.1 活動事件合成

如果活動觸發器的例項不是click型別的事件(即,不是使用者通過滑鼠或類似指標裝置點選按鈕或連結生成的),實現必須合成並分派一個click型別的事件,作為該活動觸發器的一個預設動作;而Event.target的值必須設定為最近目標元素(正常情況下是當前獲得焦點的元素),而且該事件必須模擬“左擊”(例如,MouseEvent.button屬性值必須是0,而MouseEvent.buttons屬性值必須是1)。這個模擬的click事件的其他上下文資訊由實現決定。但考慮到歷史原因,無論啟用當前元素的裝置是什麼,這個click事件的介面必須是MouseEvent介面。阻止活動觸發器預設動作時(比如使用Event.preventDefault()),必須停止活動行為的啟動。

例子:當使用者使用鍵盤啟用超連結時,比如在超連結獲得焦點時按下Enter鍵或空格鍵,各自的keydown事件還要分派一個click事件作為預設動作

即使正常情況下不會分派這個事件(例如,通過聲音指令請求活動,但本規範沒有考慮聲音輸入的事件型別),實現也必須按照上面的描述分派這個合成的click事件。

注意:事件目標的活動與裝置相關,同時也與應用相關。例如,文件中的連結可以通過滑鼠單擊或滑鼠雙擊來啟用。

支援DOMActivate事件的實現也應當分派一個DOMActivate事件,作為與活動觸發器關聯的click事件的預設動作。不過,這種實現只能針對活動觸發器被啟用而觸發一次關聯的活動行為

例子:DOMActivate事件是XForms必須支援事件型別,是針對宿主語言中的實現定義的。對於那些為了安裝到不支援DOMActivate事件型別的本規範的原生實現中的基於外掛或指令碼的XForms實現,XForms使用者代理必須根據相應的活動觸發器合成並分派它自己的DOMActivate事件。這樣,當DOM Level 3 Event使用者代理分派click事件時,XForms使用者代理必須確定是否合成帶有同樣相關屬性的DOMActivate事件,作為click事件的預設動作;相應的提示可能是click事件是否可信任,或者是否它的最近事件目標註冊了DOMActivate事件監聽器。

i

注意:內容作者不應當依賴很多代理中對DOMActivate的配合支援。因此,內容作者可以在自己認為合適的情況下,或者在對某個活動觸發器作出響應時使用DOMActivate事件。但由於click的實現更加廣泛,考慮到無障礙性,還是應該使用click事件。

i

警告:本規範不贊成使用DOMActivate事件。

3.5.2 活動事件順序

在某種程度上,活動觸發器和行為可以通過一組按照先後順序分派的事件來定義。以下就是通過指標裝置啟用的元素的典型事件序列(只列出相關事件):

  1. click
  2. DOMActivate(預設動作,如果使用者代理支援;合成;trusted="false")
  3. 其他所有預設動作,包括活動觸發器

以下是通過鍵盤啟用一個獲得焦點的元素的典型事件序列(只列出相關事件):

  1. keydown(必須是一個能夠啟用該元素的鍵,例如Enter鍵和空格鍵,否則不能啟用該元素)
  2. click(預設動作;合成;trusted="false")
  3. DOMActivate(預設動作,如果使用者代理支援;合成;trusted="false")
  4. 其他所有預設動作,包括活動觸發器

相關連結:

相關文章