В моем текущем проекте используются веб-компоненты (Custom Elements и Shadow DOM), которые позволяют мне инкапсулировать сложную логику и стили вне Light DOM.
К сожалению, сейчас у меня возникла загвоздка, когда мне нужно иметь возможность переключать элементы по своему желанию, не беспокоясь об отвязке и повторной привязке обработчиков событий.
Для меня это звучит как задача делегирования событий, поэтому я попытался добавить прослушиватель событий к родительскому узлу в Light DOM, надеясь, что событие всплывет из Shadow DOM.
Похоже, что это противоречит инкапсуляции Shadow DOM, и event.target всегда является ShadowRoot, а не дочерним элементом.
Могу ли я что-то сделать, чтобы разрешить классическое делегирование событий в этой ситуации? Приведенный ниже фрагмент кода показывает проблему. Я хочу иметь возможность щелкнуть внутренний DIV и обработать щелчок в обработчике событий щелчка, но event.target всегда является custom-el
/* jshint esversion: 6 */
customElements.define('custom-el', class extends HTMLElement {
constructor() {
super();
this._shadowRoot = this.attachShadow({
mode: 'open'
});
const oInnerDiv = document.createElement('div');
oInnerDiv.classList.add('inner');
oInnerDiv.style.border = '2px solid blue';
oInnerDiv.style.padding = '3rem';
this._shadowRoot.appendChild(oInnerDiv);
}
});
document.addEventListener('click', oEvent => {
document.getElementById('result').innerText = oEvent.target.tagName;
}, true);
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
}
body {
margin: 0;
padding: 0;
}
main,
div,
custom-el {
display: inline-block;
border: 2px solid black;
padding: 3rem;
}
<main>
<custom-el>
</main>
<p id="result"></p>
oEvent.path[0]
в Chrome (поддерживают ли другие браузеры ShadowDOM?) - person Kaiido   schedule 24.07.2018oEvent.explicitOriginalTarget
, Safari, с другой стороны, похоже, не предоставляет никаких средств для доступа к нему в таком виде. - person Kaiido   schedule 24.07.2018