我正在尝试google developer site中的示例,我收到错误:“TypeError:非法构造函数。 怎么了?怎么解决?
class FancyButton extends HTMLButtonElement {
constructor() {
super(); // always call super() first in the ctor.
this.addEventListener('click', e => this.drawRipple(e.offsetX,e.offsetY));
}
// Material design ripple animation.
drawRipple(x, y) {
let div = document.createElement('div');
div.classList.add('ripple');
this.appendChild(div);
// div.style.top = `${y - div.clientHeight/2}px`;
// div.style.left = `${x - div.clientWidth/2}px`;
div.style.backgroundColor = 'currentColor';
div.classList.add('run');
div.addEventListener('transitionend', e => div.remove());
}
}
customElements.define('fancy-button', FancyButton, {extends: 'button'});
let button = new FancyButton();
button.textContent = 'Fancy button!';
button.disabled = true;
答案 0 :(得分:12)
Blink,当前实现Custom Element v1的Web引擎(例如Chrome v53+中)仅支持autonomous custom elements:请参阅open Blink bug。
如果您想定义customized built-in elements(即<button>
扩展名),则需要使用the one from Web Reflection之类的填充。
另外,您仍然可以使用自定义元素v0语法(document.registerElement
)。
更新#3
自2018年10月以来,他们使用Chrome 67+和Firefox 63+本地工作: - )
答案 1 :(得分:2)
class F_BTN extends HTMLButtonElement{
constructor(){
super(); // must call constructor from parent class
this.addEventListener(...);
.... // etc.
}
}
customElements.define("f-btn",F_BTN,{extends:'button'});
使用内联:
<body> .... <f-btn>BTN_NAME</f-btn> ... </body>
或通过javascript创建附加
var elm = new F_BTN(...options);
// F_BTN = customElements.get('f-btn') // in case F_BTN is out of scope
问题是elm = document.createElement('f-btn')
不起作用。
这就是为什么我将自定义的create_element函数设为 _E
_E = function (name, html) {
var $;
switch (true) {
case (name === '' || !name): // _E() -- a div
{
$ = document.createElement('div');
}
break;
case (!name.indexOf('<')): // _E('<h1><i>abc</i><b>A</b></h1>') -- sub_dom
{
$ = document.createElement('div');
$.innerHTML = name;
$ = $.firstElementChild;
}
break;
default:
var c = window.customElements.get(name);
if(c){
$ = new c(); // _E('f-btn') -- customElement
} else {
$ = document.createElement(name); // _E('button') -- htmlElement
}
}
if (html) $.innerHTML = html;
return $;
};
var elm1 = _E('f-btn'); parent.appendChild(elm1);