在使用自定义元素的MDN文档中,它们详细介绍了定制内置元素的示例:
customElements.define('expanding-list', ExpandingList, { extends: "ul" });允许这种使用:
<ul is="expanding-list">
...
</ul>我想知道是否有可能以同样的方式定制另一个自定义元素?例如,如果我已经创建了一个名为custom-element的元素,并且希望有它的变体,我可能希望创建一个新的special-custom-element类,并以同样的方式定义它,以便能够像这样使用它:
<custom-element is="special-custom-element">
...
</custom-element>但是,提示我出现了一个错误:Uncaught DOMException: Failed to execute 'define' on 'CustomElementRegistry': "custom-element" is a valid custom element name
当试图运行以下操作时:
customElements.define('special-custom-element', SpecialCustomElement, { extends: 'custom-element' });这是我做错了什么,还是这种行为被严格限制在内置元素上?我发现很难找到任何关于这种行为的信息,除了我链接到的页面上的信息,所以我希望从更了解规范的人那里得到一些建议。
发布于 2018-08-01 16:52:18
你不能在你想要的意义上这样做,因为:
可以创建两种类型的自定义元素: 自治自定义元素:独立元素;它们不从内置HTML元素继承。 自定义内置元素:这些元素继承-并扩展-内置的HTML元素。
customElements.define('word-count2', WordCount2, {extends: 'p'});用于扩展built-in elements。
你必须走Autonomous custom element路线按照医生的说法
以下是一个想法:
// 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);<div>
<my-element text="">
</div>
<div>
<my-element2 text="">
</div>
现在,您仍然可以扩展类(并对内置元素进行定制),并访问super的输出,这样对您可能有用,在某种程度上可能允许您获得所需的东西:
// 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'
});<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>
发布于 2019-07-29 21:32:58
您也可以这样做,SpecialCustomElement扩展CustomElement {.}CustomElement SpecialCustomElement,{SpecialCustomElement:'ul‘});
并且可以用它作为
..。
https://stackoverflow.com/questions/51636799
复制相似问题