Html 当自定义元素*及其';的子项*已初始化
我正在嵌套自定义元素。我想让父自定义元素使用其子自定义元素原型中的方法和属性。例如Html 当自定义元素*及其';的子项*已初始化,html,prototype,custom-element,Html,Prototype,Custom Element,我正在嵌套自定义元素。我想让父自定义元素使用其子自定义元素原型中的方法和属性。例如 var ChildElement=Object.create(HTMLElement.prototype); ChildElement.getName=函数(){ 返回“Bob”; } document.registerElement(“子元素”{ 原型:ChildElement }); var ParentElement=Object.create(HTMLElement.prototype); Parent
var ChildElement=Object.create(HTMLElement.prototype);
ChildElement.getName=函数(){
返回“Bob”;
}
document.registerElement(“子元素”{
原型:ChildElement
});
var ParentElement=Object.create(HTMLElement.prototype);
ParentElement.createdCallback=函数(){
var self=这个;
setTimeout(函数(){
//这会正确记录“Bob”
console.log(self.childNodes[0].getName());
}, 0);
//这将分解-未定义getName。
console.log(self.childNodes[0].getName());
};
document.registerElement(“父元素”{
原型:ParentElement
});
如内联所述,父元素无法读取在子元素的原型上定义的任何内容。如果它触发一个立即setTimeout,那么它可以;它只需要等待该元素的子节点也被设置好
出现这种情况的原因似乎是元素创建期间的回调顺序,我认为如下所示:
- 父对象的原型已设置(从HtmleElement到ParentElement)
- 调用父级的createdCallback
- 调用父级的attachedCallback
- 子对象的原型已设置(从HtmleElement到ChildElement)
- 将调用子级的createdCallback
- 孩子的attachedCallback被称为
可以说,这可以被认为是一个复制品。然而,这个问题措词不当,示例不完整,唯一的答案似乎实际上是一个实现错误,而不是解决方案(或者至少不再是当前的浏览器行为)事实上,有许多不同的方法可以通过嵌套的自定义元素实现这一点 直接方法是向父元素添加自定义回调,子元素将从其
attachedCallback
方法调用该回调:
ParentElement.childAttachedCallback = function ()
{
console.log( this.childNodes[0].getName() )
}
ChildElement.attachedCallback = function()
{
this.parentElement.childAttachedCallback()
}
在复杂场景中,您可以使用:
- 父级设置并由一个或多个子级解析的
对象Promise
- 由孩子激发并由家长捕获的自定义事件
- 一个
对象集,用于观察父对象的子列表中的更改李>MutationObserver