首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你能“定制”非内置元素吗?

你能“定制”非内置元素吗?
EN

Stack Overflow用户
提问于 2018-08-01 15:11:27
回答 2查看 681关注 0票数 3

使用自定义元素的MDN文档中,它们详细介绍了定制内置元素的示例:

代码语言:javascript
复制
customElements.define('expanding-list', ExpandingList, { extends: "ul" });

允许这种使用:

代码语言:javascript
复制
<ul is="expanding-list">

  ...

</ul>

我想知道是否有可能以同样的方式定制另一个自定义元素?例如,如果我已经创建了一个名为custom-element的元素,并且希望有它的变体,我可能希望创建一个新的special-custom-element类,并以同样的方式定义它,以便能够像这样使用它:

代码语言:javascript
复制
<custom-element is="special-custom-element">

  ...

</custom-element>

但是,提示我出现了一个错误:Uncaught DOMException: Failed to execute 'define' on 'CustomElementRegistry': "custom-element" is a valid custom element name

当试图运行以下操作时:

代码语言:javascript
复制
customElements.define('special-custom-element', SpecialCustomElement, { extends: 'custom-element' });

这是我做错了什么,还是这种行为被严格限制在内置元素上?我发现很难找到任何关于这种行为的信息,除了我链接到的页面上的信息,所以我希望从更了解规范的人那里得到一些建议。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-01 16:52:18

你不能在你想要的意义上这样做,因为:

可以创建两种类型的自定义元素: 自治自定义元素:独立元素;它们不从内置HTML元素继承。 自定义内置元素:这些元素继承-并扩展-内置的HTML元素。

代码语言:javascript
复制
customElements.define('word-count2', WordCount2, {extends: 'p'});

用于扩展built-in elements

你必须走Autonomous custom element路线按照医生的说法

以下是一个想法:

代码语言:javascript
复制
// Create a class for the element
class MyElement extends HTMLElement {
  constructor(text) {
    // Always call super first in constructor
    super();
    // Create a shadow root
    var shadow = this.attachShadow({
      mode: 'open'
    });
    // Create the span
    var wrapper = document.createElement('span');
    wrapper.textContent = !!text ? text : 'foo';

    shadow.appendChild(wrapper);
  }
}

class MyElement2 extends MyElement {
  constructor() {
    // Always call super first in constructor
    super('bar');
  }
}

// Define the new element
customElements.define('my-element', MyElement);
customElements.define('my-element2', MyElement2);
代码语言:javascript
复制
<div>
  <my-element text="">
</div>
<div>
  <my-element2 text="">
</div>

现在,您仍然可以扩展类(并对内置元素进行定制),并访问super的输出,这样对您可能有用,在某种程度上可能允许您获得所需的东西:

代码语言:javascript
复制
// Create a class for the element
class WordCount extends HTMLParagraphElement {
  constructor() {
    // Always call super first in constructor
    super();

    // count words in element's parent element
    const wcParent = this.parentNode;

    function countWords(node) {
      const text = node.innerText || node.textContent;
      return text.split(/\s+/g).length;
    }

    const count = `Words: ${countWords(wcParent)}`;

    // Create a shadow root
    const shadow = this.attachShadow({
      mode: 'open'
    });

    // Create text node and add word count to it
    const text = document.createElement('span');
    text.textContent = count;

    // Append it to the shadow root
    shadow.appendChild(text);

    // Update count when element content changes
    text.textContent = count;
  }
}

class WordCount2 extends WordCount {
  constructor() {
    // Always call super first in constructor
    super();
    console.log(this.shadowRoot.textContent)
  }
}

// Define the new element
customElements.define('word-count', WordCount, {
  extends: 'p'
});
customElements.define('word-count2', WordCount2, {
  extends: 'p'
});
代码语言:javascript
复制
<div>
  <h2>Sample heading</h2>
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc pulvinar sed justo sed viverra. Aliquam ac scelerisque tellus. Vivamus porttitor nunc vel nibh rutrum hendrerit. Donec viverra vestibulum pretium. Mauris at eros vitae ante pellentesque bibendum.
    Etiam et blandit purus, nec aliquam libero. Etiam leo felis, pulvinar et diam id, sagittis pulvinar diam. Nunc pellentesque rutrum sapien, sed faucibus urna sodales in. Sed tortor nisl, egestas nec egestas luctus, faucibus vitae purus. Ut elit nunc,
    pretium eget fermentum id, accumsan et velit. Sed mattis velit diam, a elementum nunc facilisis sit amet.</p>
  <p is="word-count"></p>
</div>

<div>
  <h3>Sample heading</h3>
  <p>Lorem ipsum dolor sit amet, consec Sed tortor nisl, egestas nec egestas luctus, faucibus vitae purus. Ut elit nunc, pretium eget fermentum id, accumsan et velit. Sed mattis velit diam, a elementum nunc facilisis sit amet.</p>
  <p is="word-count2"></p>
</div>

票数 1
EN

Stack Overflow用户

发布于 2019-07-29 21:32:58

您也可以这样做,SpecialCustomElement扩展CustomElement {.}CustomElement SpecialCustomElement,{SpecialCustomElement:'ul‘});

并且可以用它作为

..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51636799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档