【问题标题】:Custom HTML element extending another custom element扩展另一个自定义元素的自定义 HTML 元素
【发布时间】:2019-12-11 09:47:39
【问题描述】:

我有一个自定义 HTML 标签<fancy-foo>,我想扩展它的功能。一些<fancy-foo> 元素将使用pretty-bar 自定义元素进行扩展,这样我就可以在我的HTML 中将它们用作

<fancy-foo is="pretty-bar">
    <!-- content -->
</fancy-foo>

所以,我定义类FancyFooPrettyBar,定义fancy-foo 元素并使用pretty-bar 扩展它,如下所示:

class FancyFoo extends HTMLElement {
  constructor() {
    super();
  }
}

class PrettyBar extends FancyFoo {
  constructor() {
    super();
  }
}

window.customElements.define('fancy-foo', FancyFoo);
window.customElements.define('pretty-bar', PrettyBar, {extends: 'fancy-foo'});

遗憾的是,谷歌浏览器会吐出错误

未捕获的 DOMException:无法在“CustomElementRegistry”上执行“定义”:“fancy-foo”是有效的自定义元素名称

这是一个奇怪的错误。奇怪的是,它说“fancy-foo”一个有效的自定义元素名称;我知道,但是为什么会抛出错误呢?

这是怎么回事?

【问题讨论】:

    标签: html custom-element


    【解决方案1】:

    您不能以这种方式扩展自定义元素(使用{extends: '...'})。您只能扩展 内置(=标准)HTML 元素。

    如果您想将PrettyBar 设计为FancyFoo 的扩展,您需要将其定义为自治 自定义元素:

    class PrettyBar extends FancyFoo {...}
    window.customElements.define('pretty-bar', PrettyBar)
    

    HTML 标记也是如此:

    <pretty-bar></pretty-bar>
    

    【讨论】:

    • 这是有道理的。不过,错误消息的措辞很奇怪,但我想这无关紧要。
    • 我得到“自治自定义元素必须扩展 HTMLElement”:(。请注意,在我的例子中,FancyFoo 正在扩展 HTMLDivElement。
    • @ESL 但您是否将{extends:'div'} 添加为第三个参数?
    • 是的,有和没有出现不同的例外。显然,不允许重新扩展非 HTMLElement 元素类的扩展并将其实现为自定义元素。我不明白为什么,我需要阅读文档和文档才能找到它。
    • 这很奇怪。如果可以扩展 HTMLDivElement 并将其实现为自定义元素,为什么我不能对该类的扩展做同样的事情???
    猜你喜欢
    • 2022-01-16
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多