认识Custom Element

623 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

我们可以使用Custom ELements顶一个一个HTML标签,Custom Elements主要由两种:

  • Autonomous custom elements (自主自定义标签)

    • 这个继承自HTMLElement抽象类,是一个全新的元素,你可以直接把它们写成HTML标签的形式,来在页面上使用。例如 <popup-info>,或者是document.createElement("popup-info")这样。
  • Customized built-in elements (自定义内建元素)

    • 这个是继承已有的内建类,如继承自<p>元素则继承HTMLParagraphElement,使用时,需要先写出基本的元素标签,并通过 is 属性指定custom element的名称。例如<p is="word-count">, 或者 document.createElement("p", { is: "word-count" })

Custom Element标签的名称必须包含一个短横线 -

  • my-elements是一个有效的元素名,但myelement便不是,因为这样可以确保Custom element元素与内建的HTML元素不出现冲突

创建一个Custom Elements

  • 使用CustomElementRegistry.define()方法可以将一个类与一个自定义标签名进行关联,从而将这个标签像原生HTML标签一样使用。
CustomElementRegistry.define(name,constructor,options)
  • name: 自定义标签名称

  • constructor: 自定义元素构造器,也就是我们创建的类

  • options: 控制选择

    • extends: 该元素继承自什么元素,Customized built-in elements需要用到该选项

Autonomous custom elements

  • 首先定义一个实现我们需要功能的类
class FirstElement extends HTMLElement {
  constructor() {
    // 必须首先调用 super方法
    super();

    // 元素的功能代码写在这里

    //创建一个根元素(如果script在元素创建前可用真实DOM,但必须调用this.append,但本质上这种行为是不符合HTML5标准的,此处还是应该使用shadowDOM)
    //const root = document.createElement('div');
    //将根元素与该类关联(不推荐)
    //this.append(root)
    //创建根元素使用root
    const root = this.attcahShadow({mode: 'open'})

    //设置监听事件
    //....
    //创建style标签声明样式
    //....
    //挂载其他DOM节点
    //...
  }
}
  • 将自定义标签与类进行关联
customElements.define('first-element', FirstElement);
  • 使用自定义元素
<first-element></first-element>
  • 完整代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 使用该标签 -->
    <first-element></first-element>
</body>
<script>
class FirstElement extends HTMLElement {
  constructor() {
    // 必须首先调用 super方法
    super();
​
    // 元素的功能代码写在这里
​
    //创建一个根元素
    const root = document.createElement('div');
    //将根元素与该类关联
    this.append(root)
​
    //设置监听事件
    //....
    //创建style标签声明样式
    //....
    //挂载其他DOM节点
    //...
  }
}
//定义新的元素
customElements.define('first-element', FirstElement);
</script>
</html>

Customized built-in elements

  • 创建方式与上述方式相似,直接给出完整代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 使用该标签 -->
    <button is="expanding-button"></button>
    <!-- 可继承原标签已有元素 -->
    <button is="hello-button" disabled></button>
</body>
<script>
class ExpandingButton extends HTMLButtonElement {
  constructor() {
    // 必须首先调用 super方法
    super();
​
    // 元素的功能代码写在这里
​
    //创建一个根元素
    const root = document.createElement('div');
    //将根元素与该类关联
    this.append(root)
​
    //设置监听事件
    //....
    //创建style标签声明样式
    //....
    //挂载其他DOM节点
    //...
  }
}
//定义新的元素
customElements.define('expanding-button', ExpandingButton, { extends: "button" });
</script>
</html>