Событие: свойство eventPhase
Базовая Широко доступна
Эта функция хорошо зарекомендовала себя и работает во многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
Примечание: Эта функция доступна в Потоках веб-работы.
Свойство eventPhase только для чтения интерфейса Event указывает, какая фаза потока события в настоящее время оценивается.
Значение
Возвращает целое значение, которое определяет текущую фазу оценки потока события. Возможные значения:
Event.NONE(0)-
В данный момент событие не обрабатывается.
Event.CAPTURING_PHASE(1)-
Событие распространяется через родительские объекты целевого объекта. Этот процесс начинается с
Window, затемDocument, затемHTMLHtmlElementи так далее, пока не будет достигнут родитель целевого элемента. Событийные обработчики, зарегистрированные для режима захвата при вызовеEventTarget.addEventListener(), запускаются на этой фазе. Event.AT_TARGET(2)-
Событие достигло целевого объекта события. Событийные обработчики, зарегистрированные для этой фазы, вызываются в данный момент. Если
Event.bubblesустановлено вfalse, обработка события завершается после завершения этой фазы. Event.BUBBLING_PHASE(3)-
Событие распространяется обратно вверх по родительским объектам целевого объекта в обратном порядке, начиная с родителя и, в конечном итоге, достигая содержащего
Window. Это известно как восходящее распространение и происходит только еслиEvent.bubblesустановлено вtrue. Событийные обработчики, зарегистрированные для этой фазы, запускаются в ходе этого процесса.
Пример
HTML
<h4>Event Propagation Chain</h4>
<ul>
<li>Click 'd1'</li>
<li>Analyze event propagation chain</li>
<li>Click next div and repeat the experience</li>
<li>Change Capturing mode</li>
<li>Repeat the experience</li>
</ul>
<input type="checkbox" id="chCapture" />
<label for="chCapture">Use Capturing</label>
<div id="d1">
d1
<div id="d2">
d2
<div id="d3">
d3
<div id="d4">d4</div>
</div>
</div>
</div>
<div id="divInfo"></div>
CSS
div {
margin: 20px;
padding: 4px;
border: thin black solid;
}
#divInfo {
margin: 18px;
padding: 8px;
background-color: white;
font-size: 80%;
}
JavaScript
let clear = false;
let divInfo = null;
let divs = null;
let chCapture = null;
window.onload = () => {
divInfo = document.getElementById("divInfo");
divs = document.getElementsByTagName("div");
chCapture = document.getElementById("chCapture");
chCapture.onclick = () => {
removeListeners();
addListeners();
clearDivs();
};
clearDivs();
addListeners();
};
function removeListeners() {
for (const div of divs) {
if (div.id !== "divInfo") {
div.removeEventListener("click", onDivClick, true);
div.removeEventListener("click", onDivClick, false);
}
}
}
function addListeners() {
for (const div of divs) {
if (div.id !== "divInfo") {
if (chCapture.checked) {
div.addEventListener("click", onDivClick, true);
} else {
div.addEventListener("click", onDivClick, false);
div.onmousemove = () => {
clear = true;
};
}
}
}
}
function onDivClick(e) {
if (clear) {
clearDivs();
clear = false;
}
if (e.eventPhase === 2) {
e.currentTarget.style.backgroundColor = "red";
}
const level =
["none", "capturing", "target", "bubbling"][e.eventPhase] ?? "error";
const para = document.createElement("p");
para.textContent = `${e.currentTarget.id}; eventPhase: ${level}`;
divInfo.appendChild(para);
}
function clearDivs() {
for (let i = 0; i < divs.length; i++) {
if (divs[i].id !== "divInfo") {
divs[i].style.backgroundColor = i % 2 !== 0 ? "#f6eedb" : "#cceeff";
}
}
divInfo.textContent = "";
}
Результат
Спецификации
| Спецификация |
|---|
| DOM # ref-for-dom-event-eventphase③ |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
eventPhase |
1 | 12 | 1.5 | ≤12.1 | 1 | 18 | 4 | ≤12.1 | 1 | 1.0 | 4.4 |
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Event/eventPhase