【问题标题】:Extending an HTML Element扩展 HTML 元素
【发布时间】:2018-05-12 08:21:58
【问题描述】:

我正在使用 ES5 制作一个扩展 HTMLAnchorElement 的自定义 Web 组件。由于 Web 组件仅在 ES6 及更高版本中工作,我已包含位于 here. 的 ES5 polyfill

制作一个扩展 HTMLElement 的 Web 组件,然后在页面上使用它的标签可以正常工作。但扩展HTMLElement 以外的任何元素似乎都不起作用。

我正在使用最新版本的谷歌浏览器进行测试。

下面是我扩展 HTMLAnchorElement 的元素的代码。

function CustomAnchor() {
    HTMLAnchorElement.call(this);
}

CustomAnchor.prototype.connectedCallback = function () {
    console.log('anchor added to dom');

    this.addEventListener('click', 
        function(e) {
            console.log('test');
            e.preventDefault();
            var result = confirm('Confirmed!');
        }
    );
};

window.customElements.define('custom-anchor', CustomAnchor, {extends: 'a'});

下面是创建元素并将其添加到 DOM 的代码:

var el1 = document.createElement("a")
el1.setAttribute("is", "custom-anchor")
el1.setAttribute("href", "http://www.google.com/")
el1.text = "Go to Google"
document.body.appendChild(el1)

这是 DOM 中显示的内容,看起来是正确的:

<a is="custom-anchor" href="http://www.google.com/">Go to Google</a>

控制台中没有显示任何错误,但是当元素附加到 DOM 时,connectedCallback 永远不会被触发。

链接就像一个普通的锚链接一样工作,就好像它从未被扩展过一样。

我在这里做错了什么?

【问题讨论】:

  • 这些都不对。第一,您不能扩展特定元素,只能扩展 HTMLElement。 2、你为什么在最新的chrome中使用带有适配器的ES 5?使用规范要求的类。将您链接的 shim 和 babel 用于旧浏览器。旁注:connectedCallback 过早触发有问题,我通常将内容包装在 0 的 setTimeout 中。有关更多信息,请参阅 this
  • @JaredSmith 我实际上在使用 Kotlin,这就是我需要 ES5 适配器的原因。我几乎向你们展示了 Kotlin 编译器输出的内容。最后,您可以扩展特定元素。它是规范的一部分。我建议你做一些阅读以加快速度。
  • @JaredSmith 给你,这是你需要阅读的内容:w3c.github.io/webcomponents/spec/custom/…
  • 我的立场是正确的。有一个+1。但是它没有实现(或者如果它在标志后面),在 Chrome 62 中调用 class Foo extends HTMLButtonElement 会引发非法构造函数错误。我还建议不要尝试在JavaScript 以外的语言,除非它是 POC:很难说在这个过程中哪里出了问题。我可以从痛苦的个人经历告诉你,全新的东西(例如模块、本地自定义元素)的 devtools 错误消息比它们更陈旧的对应物更不透明。
  • 感谢您的建议。我刚刚尝试从我发布的链接中运行示例,看来您是对的。感谢您的帮助。

标签: javascript html web-component


【解决方案1】:

截至 2017 年 11 月 28 日,任何浏览器均不支持扩展 HTMLElement 以外的任何内容。 Native V1 组件不支持&lt;button is="my-button"&gt;Click Me&lt;/button&gt; 的想法。

有关更多信息,请阅读此处的Extending native HTML elements 部分:https://developers.google.com/web/fundamentals/web-components/customelements

它指出: “警告:在撰写本文时,没有浏览器实现自定义的内置元素(状态)。这对于可访问性和渐进增强来说是不幸的。如果您认为扩展原生 HTML 元素很有用,请在 Github 上表达您的想法。"

更新 1:

截至 2018 年 5 月 28 日,Chrome 67 支持自定义内置元素 Firefox 63 也声称完全支持。

2018 年 9 月或 10 月的某个时候,MS 开始致力于支持 Edge 中的自定义元素和 Shadow DOM。 但没有迹象表明何时完成。

【讨论】:

猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 2020-07-29
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多