如何将 Web 组件代码连接到 DOM 的最终确定?

How do I connect web component code to the finalization of the DOM?

提问人:Deane 提问时间:10/29/2023 更新时间:10/30/2023 访问量:38

问:

如何延迟 Web 组件中代码的执行,直到整个文档加载并准备就绪?

我的 Web 组件需要与自身外部的元素进行交互——它将查询元素的标签,这些元素通常会按文档顺序出现在 Web 组件之后。因此,Web 组件将首先添加到 DOM 中。body

果然,在 中,我找不到其他元素,我猜是因为它们还没有被添加到 DOM 中。如果我将我的 Web 组件移动到页面的较低位置,它会发现它们很好(可能是因为它们是在 Web 组件之前添加的)。connectedCallback

我尝试了传统的方法,但问题是在里面,现在引用的是 HTML 文档,而不是我的 Web 组件。所以我在 Web 组件的“外部”执行代码,这不是我想要的。document.addEventListener('DOMContentLoaded', myFunction)myFunctionthis

如何在 Web 组件的上下文中执行某些操作并执行代码?或者,无论我的 Web 组件位于页面上的哪个位置,我该如何推迟执行,直到整个 DOM 都填充完毕?DOMContentLoaded

javascript dom web-component

评论

2赞 Konrad 10/29/2023
document.addEventListener('DOMContentLoaded', () => myFunction())document.addEventListener('DOMContentLoaded', myFunction.bind(thecomponent))
0赞 Deane 10/29/2023
你会把它放在哪里?在构造函数中?
0赞 Danny '365CSI' Engelman 10/29/2023
一些暗中捅刀子:使用 但要小心使用,为什么执行代码太晚?通过您的评论,您可能还想学习 Mutation Observer API。添加您尝试实现的目标的代码示例。<script defer src="...">.bind(this)

答:

0赞 This Guy 10/30/2023 #1

在 connectedCallback 中添加事件侦听器,或者,你“可以”使用 setTimout( ()=>myfunction, 5000 ) 等待 5 秒后再运行。“Hacky”,但应该有效。

class MyCustomWebComponent extends HTMLElement {

  constructor() {
    super();
  }
  myFunction(e) {
    // do the thing with the body elements
  }
  connectedCallback() {
    document.addEventListener('DOMContentLoaded', (e) => myFunction(e);) // using anonymous function will bind 'this' properly to myFunction
  }
}
https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event