Javascript 使用X标记创建自定义子元素的正确方法

Javascript 使用X标记创建自定义子元素的正确方法,javascript,html,web-component,x-tag,Javascript,Html,Web Component,X Tag,因此,我知道,使用该选项可以创建HTML中显示的自定义元素,如下所示: <x-my-custom-element>my content</x-my-custom-element> <x-my-custom-element> <x-my-custom-element-child> <x-my-custom-element-grandchild></x-my-custom-element-grandchild

因此,我知道,使用该选项可以创建HTML中显示的自定义元素,如下所示:

<x-my-custom-element>my content</x-my-custom-element>
<x-my-custom-element>
    <x-my-custom-element-child>
        <x-my-custom-element-grandchild></x-my-custom-element-grandchild>
    </x-my-custom-element-child>
</x-my-custom-element>
还有,有没有办法强制子元素始终是另一个元素的子元素?换言之,这将起作用:

<x-my-custom-element-parent>
    <x-my-custom-element-child></x-my-custom-element-child>
</x-my-custom-element-parent>

但这不会:

<x-my-custom-element-child>
    <x-my-custom-element-parent></x-my-custom-element-parent>
</x-my-custom-element-child>

不能在同一原型中注册3个不同的自定义元素

因此,您需要创建3个不同的原型,例如使用
Object.create()

然后调用
regsiter()
方法


关于第二个问题,在创建附加元素时,您需要控制自定义元素的内容。

您不能在同一原型中注册3个不同的自定义元素

因此,您需要创建3个不同的原型,例如使用
Object.create()

然后调用
regsiter()
方法


关于第二个问题,在创建附加元素时,您需要控制自定义元素的内容。

因为您的自定义元素名称是有效的(包含一个“破折号”
-
字符),如果需要添加功能,您只需使用
xtag.register()
注册它们,属性、默认内容、阴影DOM等。名称无法识别但有效的元素将只是
HTMLElement
对象。名称无法识别且无效的元素将成为
htmlunknowneelement
对象

// valid custom element name
document.createElement('foo-bar') instanceof HTMLElement; // true

// invalid custom element name
document.createElement('foobar') instanceof HTMLUnknownElement; // true
你可以看报纸


我不知道如何强制元素层次结构。标准HTML元素不强制执行此操作。例如,您可以执行
    • 。如果使用不当,这些元素就无法正常工作。

      因为自定义元素名是有效的(包含“破折号”
      -
      字符),如果需要添加功能、属性、默认内容、阴影DOM、,等。名称无法识别但有效的元素将只是
      HTMLElement
      对象。名称无法识别且无效的元素将成为
      htmlunknowneelement
      对象

      // valid custom element name
      document.createElement('foo-bar') instanceof HTMLElement; // true
      
      // invalid custom element name
      document.createElement('foobar') instanceof HTMLUnknownElement; // true
      
      你可以看报纸


      我不知道如何强制元素层次结构。标准HTML元素不强制执行此操作。例如,您可以执行
      • 。如果像这样使用不当,这些元素就无法正常工作。

        我指的是web组件库(请参阅更新)。我不太确定你的答案是否与此相符。我指的是web组件库(见更新)。我不太确定你的答案是否与此相符。谢谢。我更新了这个问题,因为x-tag可能不清楚我指的是什么。关于强制合规性,我想
        控制台。当子元素使用不当时发出警告。但是,我认为我可以在x-tag内部实现这样的功能。@Obinwanehill您可以在
        插入的
        生命周期函数中查看
        父节点的
        标记名
        ,如果不是预期的,则执行
        控制台.warn()
        :xtag.register('custom-child',{lifecycle:{inserted(){if('custom-parent'!==this.parentNode.tagName.toLowerCase())控制台。警告('should's child of')})是的,这正是我所想的。谢谢。谢谢。我更新了这个问题,因为x-tag可能不清楚我指的是什么。关于强制合规性,我想
        控制台。当子元素使用不当时发出警告。但是,我想我可以在x-tag内部实现这样做的功能。@obinwanehill可以在
        inserted
        生命周期函数中查看
        parentNode
        标记名
        ,如果不是您期望的,则执行
        console.warn()
        :xtag.register('custom-child',{lifecycle:{inserted(){if('custom parent'!==this.parentNode.tagName.toLowerCase())console.warn('should's child of')}}是的,这正是我所想的。谢谢。
        // valid custom element name
        document.createElement('foo-bar') instanceof HTMLElement; // true
        
        // invalid custom element name
        document.createElement('foobar') instanceof HTMLUnknownElement; // true