UI 事件

概念與用法

UI 事件 API 定義了一個用於處理使用者互動(如滑鼠和鍵盤輸入)的系統。這包括

  • 在特定使用者操作(如按鍵或滑鼠單擊)時觸發的事件。這些事件大多在 Element 介面上觸發,但與載入和解除安裝資源相關的事件在 Window 介面上觸發。
  • 事件介面,它們被傳遞給這些事件的處理程式。這些介面繼承自 Event,並提供特定於使用者互動型別的額外資訊:例如,KeyboardEvent 被傳遞給 keydown 事件處理程式,並提供有關按下的鍵的資訊。

介面

CompositionEvent

傳遞給組合事件處理程式的事件。組合事件使使用者能夠輸入可能不在物理鍵盤上提供的字元。

FocusEvent

傳遞給焦點事件處理程式的事件,這些事件與元素獲得或失去焦點相關。

InputEvent

傳遞給輸入事件處理程式的事件,這些事件與使用者進行某些輸入相關;例如,使用 <input> 元素。

KeyboardEvent

傳遞給鍵盤抬起/按下事件處理程式的事件。

MouseEvent

傳遞給滑鼠事件處理程式的事件,包括滑鼠移動、滑鼠移入和移出、以及滑鼠按鈕抬起或按下。請注意,auxclickclickdblclick 事件傳遞的是 PointerEvent 物件。

MouseScrollEvent 已棄用

已棄用、僅限 Firefox、非標準的滾動事件介面。請改用 WheelEvent

MutationEvent 已棄用

傳遞給可變事件處理程式的事件,這些事件旨在允許通知 DOM 的更改。現在已棄用:請改用 MutationObserver

UIEvent

其他 UI 事件繼承的基類,也是傳遞給某些事件(如 loadunload)的事件介面。

WheelEvent

傳遞給 wheel 事件處理程式的事件,當用戶旋轉滑鼠滾輪或類似的 UI 元件(如觸控板)時觸發。

事件

abort

當資源載入被中止時觸發(例如,因為使用者取消了它)。

auxclick

當用戶單擊非主指標按鈕時觸發。

beforeinput

在 DOM 即將根據使用者輸入進行更新之前觸發。

blur

當一個元素失去焦點時觸發。

click

當用戶單擊主指標按鈕時觸發。

compositionend

當文字組合系統(如語音轉文字處理器)結束其會話時觸發;例如,因為使用者已將其關閉。

compositionstart

當用戶啟動與文字組合系統的新會話時觸發。

compositionupdate

當文字組合系統使用新字元更新其文字時觸發,這在 CompositionEventdata 屬性中反映。

contextmenu

在呼叫上下文選單之前觸發。

dblclick

當用戶雙擊主指標按鈕時觸發。

error

當資源載入失敗或無法處理時觸發(例如,如果影像無效或指令碼有錯誤)。

focus

當元素獲得焦點時觸發。

focusin

當元素即將獲得焦點時觸發。

focusout

當元素即將失去焦點時觸發。

input

在 DOM 根據使用者輸入(例如,某些文字輸入)更新之後立即觸發。

keydown

當用戶按下按鍵時觸發。

keypress 已棄用

當用戶按下按鍵時觸發,僅當按鍵產生字元值時。請改用 keydown

keyup

當用戶釋放按鍵時觸發。

load

當整個頁面載入完畢時觸發,包括所有依賴資源,如樣式表和影像。

mousedown

當用戶在元素或其子元素上按下滑鼠或其它指標裝置按鈕時觸發。

mouseenter

當滑鼠或其它指標裝置在元素或其子元素邊界內移動時觸發。

mouseleave

當滑鼠或其它指標裝置移出元素及其所有子元素的邊界時觸發。

mousemove

當滑鼠或其它指標裝置在元素上方移動時觸發。

mouseout

當滑鼠或其它指標裝置移出元素邊界時觸發。

mouseover

當滑鼠或其它指標裝置移到元素上方時觸發。

mouseup

當用戶在元素上釋放滑鼠或其它指標裝置按鈕時觸發。

unload

當文件或子資源正在解除安裝時觸發。

wheel

當用戶旋轉滑鼠滾輪或類似的 UI 元件(如觸控板)時觸發。

示例

滑鼠事件

此示例記錄滑鼠事件以及生成事件的 X 和 Y 座標。嘗試將滑鼠移入黃色和紅色方塊,然後單擊或雙擊。

HTML

html
<div id="outer">
  <div id="inner"></div>
</div>

<div id="log">
  <pre id="contents"></pre>
  <button id="clear">Clear log</button>
</div>

CSS

css
body {
  display: flex;
  gap: 1rem;
}

#outer {
  height: 200px;
  width: 200px;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: yellow;
}

#inner {
  height: 100px;
  width: 100px;
  background-color: red;
}

#contents {
  height: 150px;
  width: 250px;
  border: 1px solid black;
  padding: 0.5rem;
  overflow: scroll;
}

JavaScript

js
const outer = document.querySelector("#outer");
const inner = document.querySelector("#inner");
const contents = document.querySelector("#contents");
const clear = document.querySelector("#clear");
let lines = 0;

outer.addEventListener("click", (event) => {
  log(event);
});

outer.addEventListener("dblclick", (event) => {
  log(event);
});

outer.addEventListener("mouseover", (event) => {
  log(event);
});

outer.addEventListener("mouseout", (event) => {
  log(event);
});

outer.addEventListener("mouseenter", (event) => {
  log(event);
});

outer.addEventListener("mouseleave", (event) => {
  log(event);
});

function log(event) {
  const prefix = `${String(lines++).padStart(3, "0")}: `;
  const line = `${event.type}(${event.clientX}, ${event.clientY})`;
  contents.textContent = `${contents.textContent}${prefix}${line}\n`;
  contents.scrollTop = contents.scrollHeight;
}

clear.addEventListener("click", () => {
  contents.textContent = "";
  lines = 0;
});

結果

鍵盤和輸入事件

此示例記錄 keydownbeforeinputinput 事件。嘗試在文字區域輸入內容。請注意,像 Shift 這樣的按鍵會觸發 keydown 事件,但不會觸發 input 事件。

HTML

html
<textarea id="story" rows="5" cols="33"></textarea>

<div id="log">
  <pre id="contents"></pre>
  <button id="clear">Clear log</button>
</div>

CSS

css
body {
  display: flex;
  gap: 1rem;
}

#story {
  padding: 0.5rem;
}

#contents {
  height: 150px;
  width: 250px;
  border: 1px solid black;
  padding: 0.5rem;
  overflow: scroll;
}

JavaScript

js
const story = document.querySelector("#story");
const contents = document.querySelector("#contents");
const clear = document.querySelector("#clear");
let lines = 0;

story.addEventListener("keydown", (event) => {
  log(`${event.type}(${event.key})`);
});

story.addEventListener("beforeinput", (event) => {
  log(`${event.type}(${event.data})`);
});

story.addEventListener("input", (event) => {
  log(`${event.type}(${event.data})`);
});

function log(line) {
  const prefix = `${String(lines++).padStart(3, "0")}: `;
  contents.textContent = `${contents.textContent}${prefix}${line}\n`;
  contents.scrollTop = contents.scrollHeight;
}

clear.addEventListener("click", () => {
  contents.textContent = "";
  lines = 0;
});

結果

規範

規範
UI 事件

另見