shadow dom - 知道什么时候 dom 是 rendered/changed
shadow dom - know when dom is rendered/changed
我正在编写一个 chrome 扩展程序,可以在加载或更改页面时修改元素属性。
我使用 Mutation Observer 执行此操作。然而,当 shadow-dom(即嵌入的推特帖子)为 loaded/changed.
时,不会调用观察者的处理程序
有没有办法在 shadow-dom 为 loaded/changes 时获取事件或将突变观察器挂接到它?
谢谢!
您可以简单地 observe()
带有影子 DOM 的元素的 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
添加到配置中(或者可能将子级设置为各自的 shadowRoots分派一个事件 {composed: true, cancelable: true, bubbles: true}
将更改通知给你的组件的祖先;
需要在 shadowRoot 中添加一个插槽,并向其添加事件侦听器,例如 shadowRoot.innerHTML = <slot onslotchange=...>empty slot</slot>
适合在上下文中工作
https://developer.mozilla.org/docs/Web/API/HTMLSlotElement/slotchange_event
我正在编写一个 chrome 扩展程序,可以在加载或更改页面时修改元素属性。
我使用 Mutation Observer 执行此操作。然而,当 shadow-dom(即嵌入的推特帖子)为 loaded/changed.
时,不会调用观察者的处理程序有没有办法在 shadow-dom 为 loaded/changes 时获取事件或将突变观察器挂接到它?
谢谢!
您可以简单地 observe()
带有影子 DOM 的元素的 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
添加到配置中(或者可能将子级设置为各自的 shadowRoots分派一个事件 {composed: true, cancelable: true, bubbles: true}
将更改通知给你的组件的祖先;
需要在 shadowRoot 中添加一个插槽,并向其添加事件侦听器,例如 shadowRoot.innerHTML = <slot onslotchange=...>empty slot</slot>
适合在上下文中工作
https://developer.mozilla.org/docs/Web/API/HTMLSlotElement/slotchange_event