webcomponent中的子元素

asv*_*asv 6 javascript web-component custom-element

假设我们有一个以这种方式使用的自定义元素:

<list-image>
    <img src="" /> 
     .... 
</list-image>
Run Code Online (Sandbox Code Playgroud)

其中list-image以滑块方式显示img标签.如果组件的用户插入了img标记

document.querySelector('list-image').insertAdjacentHTML('beforeend', '<img src="..." />');
Run Code Online (Sandbox Code Playgroud)

组件是否可以知道新元素img?

Sup*_*arp 7

解决方案是在自定义元素本身上使用MutationObserver<list-image>.

在该connectedCallback()方法中,观察子元素的突变:

customElements.define('list-image', 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])
      })
    })

    observer.observe(this, { childList: true })
  }
})

function add() {
  document.querySelector('list-image')
          .insertAdjacentHTML('beforeend', '<img alt="TOTO" />')
}
Run Code Online (Sandbox Code Playgroud)
<list-image>
  <img alt="Image1">
  <img alt="Image2">
</list-image>
<button onclick="add()">Add image</button>
Run Code Online (Sandbox Code Playgroud)