我正在编写一个 chrome 扩展,用于在加载或更改页面时修改元素属性。
我使用突变观察器来做到这一点。但是,当加载/更改影子 dom(即嵌入式推特帖子)时,不会调用观察者的处理程序。
有没有办法在加载/更改 shadow-dom 时获取事件或将突变观察者挂接到它?
谢谢!
您可以使用 Shadow DOM 简单地observe()
元素的 shadowRoot
属性。
customElements.define('image-list', class extends HTMLElement {
connectedCallback() {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
//Detect <img> insertion
if (mutation.addedNodes.length)
console.info('Node added: ', mutation.addedNodes[0])
})
})
this.attachShadow({mode: 'open'}).innerHTML = '<img alt="image 1">'
observer.observe(this.shadowRoot, {childList: true})
}
addImage() {
var img = document.createElement('img')
img.alt = ' new image '
this.shadowRoot.appendChild(img)
}
})
<image-list id=LI>
</image-list>
<button onclick="LI.addImage()">Add image</button>
如果内容只是使用 slotchange
事件最容易,它不会触发更深层次的更改,只会触发插槽(不像观察子树和 childList 的突变观察者); 它就像插槽上 childList 的观察者,也是区分组件和槽内容之间关注点的最佳方式; 当由于某种原因观察组件自身shadowRoot
或树中更深的变化时, 在@Supersharp的答案中使用突变观察器,除了将subtree
添加到配置中(或者可能使用各自的 shadowRoot 设置子项以调度一个事件,{composed: true, cancelable: true, bubbles: true}
通知祖先到您的更改组件;
需要向shadowRoot添加一个插槽,并将事件侦听器添加到其中,例如shadowRoot.innerHTML = <slot onslotchange=...>empty slot</slot>
适应上下文
https://developer.mozilla.org/docs/Web/API/HTMLSlotElement/slotchange_event