polymer - 使用 document.getElementById 将 Web 组件元素从 ShadowDom 公开到外部 JS

标签 polymer web-component shadow-dom pwa-starter-kit

我正在使用 Polymer 提供的当前 PWA 入门套件模板。

https://github.com/Polymer/pwa-starter-kit/tree/template-typescript

我的 Web 组件元素页面返回以下带有 DIV 元素的代码:

return html`
      ${SharedStyles}    
      <section>
        ...my content...

      </section>
      <div id="CONTAINER NAME"></div>
    `

我需要通过 document.getElementById 从外部 javascript 访问 CONTAINER NAME 元素。我知道它位于 Shadow dom 中,但我无法更改外部 JS。所以问题是如何通过 document.getElementById 从 JS 访问它?

外部 JavaScript 将 iframe 加载到指定的 div 中。该外部组件需要通过 document.getElementById 获取 div 元素,以将 iframe 加载到指定的 div 中。

我已经搜索过,但没有找到一种方法来强制将 web 组件页面的影子 dom 中的 div 元素暴露/放置在 DOM 中。

我刚刚找到了这里提到的这个解决方案,但我没有让它在 PWA 模板中工作。也许因为 Shadow dom 在 PWA 模板中级联?

https://stackoverflow.com/a/47082470/9192527

有什么方法可以使用外部 javascript(第三方)更新基于 Polymer v3/PWA 套件的 Web 组件,仍然使用 document.getElementbyId 来修改 Web 组件内的 div?

所以寻找一种可能使用slots将shadow dom的元素暴露给light dom?但无法让它与上面链接的解决方案一起使用。

最佳答案

正如您所提到的,lit-element 默认使用 Shadow dom,因为它在制作可重用组件时具有很多优势。

但是,您可以选择退出它并使用“light”dom,这将在主 dom 中渲染组件的内容,从而使该内容可以使用 document.getElementById() 之类的内容进行访问。或document.querySelector()

以下是如何在基于 lit-element 的组件中使用 light dom 的最小示例(这里是 glitch,您可以在其中看到它的实际效果)

class MyElement extends LitElement {  
  render() {
    return html`
      <section>
        ... My content ...
      </section>
      <div id="myElementContainer">
        This is a container inside my element
      </div>
    `;
  }

  createRenderRoot() {
    // this is what overrides lit-element's behavior so that the contents don't render in shadow dom
    return this;
  }

}

请记住,在这种情况下,您应该只在应用程序中使用此组件一次,因为getElementById()有效,但您将无法使用 <slot>在你的组件中,因为这是一个仅适用于 Shadow dom 的功能

关于polymer - 使用 document.getElementById 将 Web 组件元素从 ShadowDom 公开到外部 JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53191079/

相关文章:

javascript - polymer 自定义元素 javascript 与 firebase 的数据绑定(bind)错误

javascript - 关于自定义 Web 组件和生命周期回调的说明

angular - 使用 Material 对话框在 Angular 元素上显示问题(ShadowDom 问题?)

javascript - 从 Shadow DOM 获取元素

javascript - Polymer CSS::content 选择器不工作

css - 如何在 CSS 变量回退中使用逗号?

javascript - 防止 polymer 指针手势在已经开始时发生,具体取决于手势

styles - 使用链接样式阻止 shadow DOM 渲染

javascript - 除了在 light DOM 中声明插槽名称之外,还有其他选择吗?