MiB*_*MiB 2 javascript web-component custom-element
似乎我必须在解析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>
Run Code Online (Sandbox Code Playgroud)
test-one
输出""
在控制台中,test-two
输出"Another."
.
然而,这似乎完全不直观,我浪费了很多时间阅读规范,但我没有找到这种行为的解释.有任何想法吗?指定或记录在哪里?这不是Chrome问题,Firefox表现相同.
实际上,您可以在将自定义元素添加到DOM之前定义它.
你不能做的是访问它的内容(属性,子树,属性)constructor()
,因为这些元素尚未被解析(正如@Patrick Evans建议的那样).
在您的示例中,您可以等待一段时间访问该textContent
属性.
constructor() {
super()
setTimeout( () => console.log(this.textContent) )
}
Run Code Online (Sandbox Code Playgroud)
如果您仍想将自定义元素定义放在标题中,则可以等待加载页面.
window.onload => customElements.define(...)
Run Code Online (Sandbox Code Playgroud)
或者,取决于您在等待什么:
document.addEventListener( 'DOMContentLoaded', customElements.define(...) )
Run Code Online (Sandbox Code Playgroud)
它在规范中不是黑白分明的,因为它是解析过程的结果,但是你可以阅读这个HTML标准部分:
不得检查元素的属性和子元素,因为在非升级的情况下不会出现任何属性和子元素,并且依赖于升级会使元素变得不可用.
"非升级案例"是在解析元素之前定义元素的时间.
归档时间: |
|
查看次数: |
91 次 |
最近记录: |