Search code examples
javascripthtmlweb-componentshadow-dom

how do I traverse elements within a shadow DOM


I have

div id=outer
  #shadowRoot
    div id=inner
    button

In the click handler of the button, I want to reference the div "inner". In a non shadowDom world, this would be document.getElementById('inner'), but what is the equivalent in a shadow DOM world?

NB. This is accessing from within the custom-element. I am not trying to pierce the shadow DOM from outside.


Solution

  • You could use the absolute path: use shadowRoot to get the Shadow DOM content.

    document.querySelector( 'div#outer' ).shadowRoot.querySelector( 'div#inner' )
    

    Or the relative path: use getRootNode() to get the Shadow DOM root

    event.target.getRootNode().querySelector( 'div#inner' )
    

    Example:

    outer.attachShadow( { mode: 'open' } )
        .innerHTML = `
            <div id=inner></div>
            <button>clicked</button>
        `
        
    outer.shadowRoot.querySelector( 'button' ).onclick = ev =>
      ev.target.getRootNode().querySelector( 'div#inner' ).innerHTML = 'clicked'
    <div id=outer></div>