查找元素的可滚动容器,包括在影子 DOM 中

ist*_*men 5 javascript dom shadow-dom ionic4

我正在寻找一个通用的解决方案来查找元素的可滚动容器(我想监听滚动事件)。正常的方法是在 DOM 树中向上遍历检查父元素,直到其中一个元素可滚动 -这里有一些类似的解决方案。然而,如果 Shadow DOM 也在图片中,这将会失败。

这是一个示例结构:

<app-home>
  <ion-content>
    #shadow-root
      <div class="inner-scroll">
        <slot>
          -> <my-element> (reveal)
        </slot>
      </div>
    <my-element>...</my-element>
  </ion-content>
</app-home>
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,可滚动元素是.inner-scroll,它位于 的 Shadow dom 内ion-content。由于my-element通过 进入容器slot,向上遍历树将永远不会到达滚动容器(my-element-> ion-content-> app-home)。

我发现它ion-content有一个getScrollElement方法,可以在这种特定情况下使用,但是我想知道是否有一个基于通用 DOM 的解决方案,因为我希望它无论上下文如何都能工作。

更新:

更清楚地说,我希望my-element成为一个独立的、可重用的组件,它可以找到它的滚动容器,无论它放在哪里。我发现,内置scrollIntoView方法适用于 DOM 元素,并且它滚动正确的容器,这意味着浏览器以某种方式找出它,但不会公开返回滚动容器的方法。

另一个想法是在更高级别上侦听滚动事件,而不知道确切的元素,但这也不起作用,因为滚动事件不会传播。

有任何想法吗?

her*_*ues 2

获取<ion-content>元素并使用其shadowRoot元素来查询可滚动元素。

const ionContent = document.querySelector('app-home > ion-content')
const scrollable = ionContent.shadowRoot.querySelector('.inner-scroll')
Run Code Online (Sandbox Code Playgroud)

然后您可以在可滚动元素中使用querySelector来查找所需的元素。如果 Shadow DOM 中有更多可滚动元素,则可以使用querySelectorAll返回节点数组。

  • 谢谢,这确实是一个纯 DOM API 解决方案,但是它不是通用的,因为我仍然需要了解 DOM 结构。我希望“my-element”成为一个独立的、可重用的组件,无论它放在哪里,它都可以找到它的滚动容器。 (3认同)