gpt4 book ai didi

javascript - 为什么我必须推迟 customElement 定义?

转载 作者:行者123 更新时间:2023-11-29 16:34:56 24 4
gpt4 key购买 nike

看来我必须在解析 HTML 正文后才定义自定义元素。如果我之前定义了它,则自定义元素的内容为空。

这是一个 MWE:

<!DOCTYPE html>
<html lang="en">
<head>
<script>
customElements.define('test-one',
class extends HTMLElement {
constructor() {
super()
console.log(this.textContent)
}
}
)
</script>
</head>

<body>
<test-one>First.</test-one>
<test-two>Another.</test-two>

<script>
customElements.define('test-two',
class extends HTMLElement {
constructor() {
super()
console.log(this.textContent)
}
}
)
</script>
</body>
</html>

test-one 在控制台中输出 ""test-two 输出 "Another."

但是,这似乎完全不直观,我浪费了很多时间阅读规范,但我没有找到对此行为的解释。有任何想法吗?在哪里指定或记录?这不是 Chrome 的问题,Firefox 的行为也是一样的。

最佳答案

实际上,您可以在将自定义元素添加到 DOM 之前定义它。

您不能做的是在其 constructor() 中访问其内容(属性、子树、属性),因为这些元素尚未被解析(如@Patrick Evans 建议的那样)。

在您的示例中,您可以等待一段时间才能访问 textContent 属性。

constructor() {
super()
setTimeout( () => console.log(this.textContent) )
}

如果您仍想将自定义元素定义放在 header 中,可以等待页面加载。

window.onload => customElements.define(...)

或者,取决于您在等待什么:

document.addEventListener( 'DOMContentLoaded', customElements.define(...) )

它在规范中不是黑白的,因为它是解析过程的结果,但您可以阅读此 HTML Standard section :

The element's attributes and children must not be inspected, as in the non-upgrade case none will be present, and relying on upgrades makes the element less usable.

“非升级情况”是指在解析元素之前定义元素。

关于javascript - 为什么我必须推迟 customElement 定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52176168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com