Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何创建自定义元素扩展类的新实例_Javascript_Html_Ecmascript 6_Web Component_Custom Element - Fatal编程技术网

Javascript 如何创建自定义元素扩展类的新实例

Javascript 如何创建自定义元素扩展类的新实例,javascript,html,ecmascript-6,web-component,custom-element,Javascript,Html,Ecmascript 6,Web Component,Custom Element,我试着从中得到一个错误:“TypeError:非法构造函数。 出了什么问题以及如何解决 class FancyButton extends HTMLButtonElement { constructor() { super(); // always call super() first in the ctor. this.addEventListener('click', e => this.drawRipple(e.offsetX,e.offsetY)); }

我试着从中得到一个错误:“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;

Blink,当前实现自定义元素v1(例如中)的web引擎仅支持:请参阅open

如果要定义(即
扩展名),则需要使用类似的多边形填充

或者,您仍然可以使用自定义元素v0语法(
document.registerement


更新#3

自2018年10月起,他们在本地与Chrome 67+和Firefox 63+合作:-)

使用内联:

<body>  ....  <f-btn>BTN_NAME</f-btn>  ...  </body>
问题是
elm=document.createElement('f-btn')
不起作用

这就是为什么我使用自定义的create_元素函数\u 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);
\u E=函数(名称、html){
var$;
开关(真){
case(name==''||!name)://_E()--一个div
{
$=document.createElement('div');
}
打破

case(!name.indexOf('您使用的浏览器(版本)是什么?当前的浏览器都不支持。来自开发者网站:Chrome 54(状态)具有自定义元素v1。Safari已开始原型化,您可以每晚在WebKit中测试API。Edge已开始原型化。Mozilla有一个开放的bug要实现。Safari不会在第一次实现自定义内置元素。因此,请检查更新的兼容性表在
customElement中添加
扩展
选项s、 define
方法对我有效。谢谢。
var elm = new F_BTN(...options); 
// F_BTN = customElements.get('f-btn') // in case F_BTN is out of scope
_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);