Element: beforeinput 事件

Baseline 已廣泛支援

此特性已得到良好建立,並適用於許多裝置和瀏覽器版本。自 ⁨2021 年 3 月⁩ 以來,所有瀏覽器都已支援此特性。

DOM 中的 beforeinput 事件會在 <input><textarea> 元素的值即將被修改時觸發。但與 input 事件不同的是,它不會在 <select> 元素上觸發。該事件也適用於啟用了 contenteditable 的元素,以及在 designMode 開啟時的任何元素。

這使得 Web 應用可以在瀏覽器修改 DOM 樹之前覆蓋文字編輯行為,並提供對輸入事件的更多控制以提高效能。

對於 contenteditabledesignMode,事件目標是編輯宿主。如果這些屬性應用於多個元素,則編輯宿主是其父元素不是可編輯元素的最近的祖先元素。

注意:並非所有使用者修改都會導致 beforeinput 觸發。此外,事件可能觸發但不可取消。當修改是由自動完成、接受拼寫檢查器的更正、密碼管理器自動填充、IME 或其他方式進行時,可能會發生這種情況。具體細節因瀏覽器和作業系統而異。為了在所有情況下覆蓋編輯行為,程式碼需要處理 input 事件,並可能撤消 beforeinput 處理程式未處理的任何修改。請參閱 bug 16735581763669

語法

在諸如 addEventListener() 之類的方法中使用事件名稱,或設定事件處理程式屬性。

js
addEventListener("beforeinput", (event) => { })

onbeforeinput = (event) => { }

事件型別

一個 InputEvent。繼承自 UIEvent

Event UIEvent InputEvent

事件屬性

此介面繼承自其父介面 UIEventEvent 的屬性。

InputEvent.data 只讀

返回一個包含插入字元的字串。如果更改沒有插入文字(例如,刪除字元),則此字串可能為空。

InputEvent.dataTransfer 只讀

返回一個 DataTransfer 物件,其中包含有關新增到可編輯內容或從中移除的富文字或純文字資料的資訊。

InputEvent.inputType 只讀

返回可編輯內容的更改型別,例如,插入、刪除或格式化文字。

InputEvent.isComposing 只讀

返回一個 Boolean 值,指示事件是在 compositionstart 之後和 compositionend 之前觸發的。

示例

特性檢測

以下函式在支援 beforeinput(從而支援 getTargetRanges)時返回 true。

js
function isBeforeInputEventAvailable() {
  return (
    window.InputEvent &&
    typeof InputEvent.prototype.getTargetRanges === "function"
  );
}

簡單日誌

此示例記錄元素當前的值,然後立即用應用於 <input> 元素的新值替換它。

HTML

html
<input placeholder="Enter some text" name="name" />
<p id="values"></p>

JavaScript

js
const input = document.querySelector("input");
const log = document.getElementById("values");

input.addEventListener("beforeinput", updateValue);

function updateValue(e) {
  log.textContent = e.target.value;
}

結果

規範

規範
UI 事件
# event-type-beforeinput

瀏覽器相容性

另見