创建自定义标签以扩展 HTML 功能

在本教程中,我将向您展示使用自定义标签扩展 html 语言是多么容易。自定义标签可用于实现各种行为,因此它们是编写更少代码并使 html 文档更简单的非常方便的方法。

要进一步了解自定义标签,请查看我关于使用 Shadow DOM 创建封装的自定义标签的文章。

什么是自定义 HTML 标记?

例如,对于 HTML,您可以使用 标记来显示粗体文本。如果您需要列表,则可以对每个列表项使用

    标签及其子标签

  • 。标签由浏览器解释,并与 CSS 一起确定网页内容的显示方式以及部分内容的行为方式。

    有时,仅使用一个 HTML 标签不足以满足 Web 应用程序所需的功能。通常,这是通过使用多个 HTML 标签以及 JavaScript 和 CSS 来解决的,但这种解决方案并不是那么优雅。

    更优雅的解决方案是使用自定义标签 – 中包含的标识符,浏览器会解释该标识符以呈现我们预期的功能。与常规 HTML 标签一样,我们应该能够在页面上多次使用自定义标签,并且还应该能够拥有标签属性和子标签来辅助自定义标签的功能。

    立即学习“前端免费学习笔记(深入)”;

    简单来说,自定义元素可用于解锁以下功能:

  • 定义和构建新的 HTML 元素
  • 构建扩展其他元素的元素
  • 创建可将自定义功能整合到应用程序中的元素
  • 使用现有 DOM 元素并扩展其 API

    在这篇文章中,我们将通过构建一个名为 的自定义标签来了解自定义元素。此自定义标签将显示特定电子邮件地址的 Gravatar 图片。

    现代浏览器中的 customElements API 让这一切变得简单!

    1. 创建项目

    为了实现和测试我们的标签,我们需要创建一些东西:

  • 使用自定义标记的 index.html 文件
  • 一个codingdude-gravatar.js文件来实现自定义标签

    2.修改index.html

    让我们编辑 index.html 文件并使其内容如下所示:

            This is my Gravatar picture:     

    如果我们现在在浏览器中加载 index.html,结果不会那么令人印象深刻,因为我们尚未实现自定义标记的代码。

    需要注意的一件事是浏览器非常宽容,因此您可以在文档中包含未知标签,浏览器将忽略它们。为了让我们的自定义标签真正显示我的电子邮件的 Gravatar 图片,我们必须首先了解 Gravatar 的工作原理。

    3.注册新标签

    第 1 步:选择正确的名称

    为了创建自定义标签,您需要使用 window.customElements.define()

    customElements.define() 中的第一个参数是标记的名称。这就是我们在 HTML 文件中提到的。该名称应始终带有破折号 (-)。名称类似于 的标签无效。这使得解析器应该能够区分常规元素和自定义标签。

    自定义元素标签名称必须始终带有破折号 (-)。

    第 2 步:选择正确的原型

    customElements.define() 有第二个可选对象。该对象用于提及新元素的原型。默认情况下,自定义元素继承自 HTMLElement。上面的代码相当于下面的代码:

    customElements.define("codingdude-gravatar", CodingDudeGravatar);

    如果您希望创建扩展另一个 HTML 元素的自定义元素,则必须在 customElements.define() 中扩展本机元素。继承本机元素的自定义元素也称为“类型扩展自定义元素”。

    customElements.define("codingdude-gravatar", class extends HTMLButtonElement {...});

    还有一些需要注意的事情:

  • 您不能多次注册该标签。如果您尝试这样做,浏览器将抛出 DOMException
  • 自定义元素标签不能自动关闭。

    4.实例化自定义元素

    HTML 元素的所有标准规则都适用于自定义元素。就像标准元素一样,您可以使用 JavaScript 在 DOM 中创建自定义元素,或在 HTML 中声明它。

    在 HTML 中声明自定义元素:

    
    

    使用 JavaScript 在 DOM 中创建自定义元素:

    var codingdudeGravatar = document.createElement('codingdude-gravatar');codingdudeGravatar.addEventListener('click',function(e){});

    在 HTML 中实例化类型扩展元素:

    使用 JavaScript 在 DOM 中创建类型扩展元素:

    var codingdudeGravatar = document.createElement('button', 'codingdude-gravatar');

    5.向自定义标签添加标记

    在自定义标签中添加标记相当简单。首先,您需要创建一个扩展父 HTML 元素的类。在我们的例子中,我们将扩展 HTMLElement。在 HTMLElement 中,我们将使用 constructor 添加事件侦听器并调整自定义标记的 innerText 。记得调用 super() 因为这将有助于继承父类的方法和属性。永远记住,构造函数内的 this 指向创建的自定义元素。

    这是我们组件外观的简单概述。

    class CodingDudeGravatar extends HTMLElement {  constructor() {    super()    this.addEventListener('click', e => {        alert('You Clicked Me!')    });    this.innerText="Hello There!"  }}window.customElements.define('codingdude-gravatar', CodingDudeGravatar);

    6.生命周期方法

    在开始向自定义标记添加标记之前,您需要了解与自定义标记关联的生命周期方法。有四个生命周期回调。

    回调 目的

    构造函数创建自定义标签元素的实例connectedCallback自定义标签元素的实例被插入到文档中disconnectedCallback自定义标签元素的实例从文档中删除attributeChangedCallback(attributeName, oldValue, newValue)添加、删除或更新了自定义标记元素中的属性

    带有这些回调的自定义标记的骨架如下所示:

    class CodingDudeGravatar extends HTMLElement {    constructor() {    super(); // always call super() first in the constructor.    ...    }    connectedCallback() {    ...    }    disconnectedCallback() {    ...    }    attributeChangedCallback(attrName, oldVal, newVal) {    ...    }}

    我们已经了解了如何在自定义元素中使用 构造函数 。现在,让我们在代码中使用其他回调方法!让我们从 connectedCallback 开始。

    connectedCallback

    connectedCallback 可用于检查自定义标记中的电子邮件属性。一旦元素添加到文档中,就会进行此检查。我们将使用 getter 函数来检查 custom tag 是否具有 email 属性。

    class CodingDudeGravatar extends HTMLElement {  get email() {    return this.hasAttribute('email');  }  constructor() {    super()    this.addEventListener('click', e => {        alert('You Clicked Me!')    });    this.innerText="Hello There!"  }  connectedCallback(){    if(this.email){        var email = this.attributes.email.value;        var gravatar = "https://www.gravatar.com/avatar"        this.innerHTML = "创建自定义标签以扩展 HTML 功能
    "+email } else { this.innerHTML = "No Email"; } }}

    当自定义标记插入 HTML 中时,您将看到如下内容:

    
    

    创建自定义标签以扩展 HTML 功能

    但是,当在自定义标签中设置 email 属性时,屏幕将如下所示:

    
    

    创建自定义标签以扩展 HTML 功能

    attributeChangedCallback

    浏览器将为 observedAttributes 数组中列出的所有属性调用生命周期方法 attributeChangedCallback。其背后的目标是提高自定义标签的性能。例如,如果用户决定更改样式,您不希望触发 attributeChangedCallback 。在我们的例子中,我们希望仅当电子邮件更改时才调用 attributeChangedCallback 。为了实现这一点,代码如下所示:

    class CodingDudeGravatar extends HTMLElement {  get email() {    return this.hasAttribute('email');  }  constructor() {    super()    this.addEventListener('click', e => {        alert('You Clicked Me!')    });    this.innerText="Hello There!"  }  connectedCallback(){    if(this.email){        var email = this.attributes.email.value;       var gravatar = "http://www.gravatar.com/avatar"            this.innerHTML = "创建自定义标签以扩展 HTML 功能
    "+email } else { this.innerHTML = "No Email"; } } static get observedAttributes() { return ['email']; } attributeChangedCallback(name, oldValue, newValue) { if(name == 'email'){ alert(`The ${name} changed to ${newValue}`) } }}

    根据上面的代码,每次我们更改电子邮件时都会看到一条警报。

    创建自定义标签以扩展 HTML 功能

    自定义元素中的回调是同步的。如果在自定义元素上调用 el.setAttribute('email','newemail') ,浏览器将立即触发 attributeChangedCallback()

    disconnectedCallback

    生命周期方法列表中的最后一个是 disconnectedCallback。当您从文档中删除元素时,将调用此方法。当您想要清除自定义标签造成的影响时,该方法非常有用。您可以使用 el.remove() 方法轻松删除自定义标签。

    但是,您必须非常小心 disconnectedCallback() 的使用方式。如果用户选择关闭选项卡或浏览器,则永远不会触发此回调。

    7.属性到属性

    在任何基于 HTML 的应用程序中,开发人员使用反映在 DOM 上的属性是很常见的。例如, hidden 是可用于隐藏元素的属性,例如

    只会隐藏 DOM 中的元素。开发人员自然希望这些属性也适用于自定义标签。

    由于我们从 HTMLElement 扩展,因此默认情况下这些属性将出现在自定义元素中。然而,这些属性的行为是可以修改的。大多数时候,JavaScript 类中的 getter 和 setter 用于控制属性。

    codingdude-gravatar[hidden] {    opacity: 0.5;    pointer-events: none;}...inside the class{    get hidden() {        return this.hasAttribute('hidden');    }        set hidden(val) {        // Reflect the value of `hidden` as an attribute.        if (val) {        this.setAttribute('hidden', '');        } else {        this.removeAttribute('hidden');        }    }}

    演示

    本文中讨论的所有内容都可以在以下演示中进行实验。

    结论

    万岁!我们已经结束了关于如何创建自定义元素的文章。现在,您应该能够创建自定义元素并在 HTML 标记中使用它。一定要尝试一下!您将会惊讶地发现我们可以完成这么多工作。

    这只是自定义元素工作原理的开始。这个领域还有很多东西需要探索和学习。请继续关注此空间,了解有关自定义元素及其高级概念的更多帖子。

  • 以上就是创建自定义标签以扩展 HTML 功能的详细内容,更多请关注创想鸟其它相关文章!

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
    发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1551578.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2025年12月21日 21:53:01
    下一篇 2025年12月8日 10:06:27

    相关推荐

    • 使用JavaScript RegExp查找数字

      在本教程中,我们将了解如何使用 JavaScript RegExp 查找数字 (0-9)。数字 [0-9] 的 ASCII 值从 48 到 57 开始。如果要打印某个数字的任何 ASCII 值,需要在该数字上添加 48。 我们在正则表达式中将数字表示为 d。 RegExp 是一个对象,它指定用于对字…

      2025年12月21日
      000
    • 如何使用HTML创建参考文献?

      参考书目是有关某个主题的书面信息来源的列表。我们在 HTML 中使用 标签来创建参考书目部分。 标签定义某个主题的作品。 标签还用于添加作品标题,例如歌曲、绘画、电影等。它表示引用,标签内的任何内容都代表作品标题。 标记之间的文本以斜体格式呈现。 我们使用 标签列出项目,使用 标签添加主题标题。 立…

      2025年12月21日
      000
    • 在HTML中设置有序列表的起始值?

      使用start属性来设置HTML中有序列表的起始值,即: 在上面添加您想要开始的位置的值。 示例 您可以尝试运行以下代码来实现start属性 – HTML ol Tag Programming Languages Rank Usage:立即学习“前端免费学习笔记(深入)”; Java C…

      2025年12月21日
      000
    • JavaScript中的availHeight属性是什么意思?

      使用screen.availHeight属性来返回用户屏幕的宽度。结果将以像素表示,并且不包括任务栏功能。 示例 您可以尝试运行以下代码来了解如何在JavaScript中使用screen.availHeight属性: 演示 document.write(“Height of the screen: …

      2025年12月21日
      000
    • 我们如何在HTML中添加一个无框架(noframe)部分?

      使用 标签添加 noframe 部分。 HTML 标签用于处理不支持 标签的浏览器。此标记用于显示备用文本消息。 示例 HTML noframes Tag Your browser does not support frames. 以上就是我们如何在HTML中添加一个无框架(noframe)部分?的…

      好文分享 2025年12月21日
      000
    • 在HTML5画布元素上绘制的图像的颜色改变

      为了更改 HTML5 Canvas 元素上绘制的图像的颜色,您可以尝试运行以下代码。使用drawImage()方法 – function display(img1, red, gr, bl) { //func to change color of image var canvas1 = …

      2025年12月21日
      000
    • 当HTML中的媒体数据加载时执行脚本吗?

      使用 onloaddata 事件在加载媒体数据时执行脚本。您可以尝试运行以下代码来实现 onloaddata 事件 – 示例 以下代码在视频加载时生成一个警报框 – Your browser does not support the video element. functi…

      2025年12月21日
      000
    • 全局RegExp属性在JavaScript中的作用是什么?

      全局属性是 RegExp 对象的只读布尔属性。它指定特定的正则表达式是否执行全局匹配,即是否使用“g”属性创建。 示例 您可以尝试运行以下代码来了解如何使用全局 RegExp 属性。 JavaScript RegExp global Property var re = new RegExp( “st…

      2025年12月21日
      000
    • 我们能通过脚本删除HTML5 Canvas标签的“getContext”属性吗?

      HTML5规范中没有说明,脚本删除getContext属性是有效的。 我们可以编写一段代码,删除HTMLCanvasElement的getContext属性,然后在单独的语句中删除我们将其设为未定义。 Delete window.HTMLCanvasElement.prototype.getCont…

      2025年12月21日
      000
    • 如何使用HTML和CSS创建动画条形图?

      概述 动画栏是使用 HTML 和 CSS 创建的图形动画栏。动画栏的布局是使用 HTML 创建的,栏的样式是使用 CSS 制作的。普通的条形图可以正常创建,但我们必须创建带有动画的条形图,因此我们将使用 CSS 过渡动画属性来使其具有动画效果。我们将构建一个与音乐动画条同步器相同的动画条。 算法 第…

      2025年12月21日
      000
    • 当浏览器开始离线工作时,在HTML中执行脚本?

      当网络浏览器开始离线工作时,onoffline 属性就会触发。您可以尝试运行以下代码来实现onoffline 属性 – 示例 function onlineFunc() { alert (“Working online!”); } function offlineFunc() { ale…

      2025年12月21日
      000
    • 如何在HTML文本框中添加换行符?

      要向 HTML 文本区域添加换行符,我们可以使用 HTML 换行符标签在任意位置插入换行符。或者,我们也可以使用 CSS 属性“white-space: pre-wrap”自动为文本添加换行符。当在文本区域中显示预先格式化的文本时,这特别有用。因此,我们来讨论一下添加换行符的方法。 方法 在 HTM…

      2025年12月21日
      000
    • 如何避免使用标签时产生换行?

      使用标签时,浏览器通常将容器内的项目放置在下一行。例如,程序员需要将标题放在一行中以创建导航组件。我们可以使用 inline、inline-block、flex-box 属性等来避免标签出现新行。 本文将解释如何通过 inline 属性、flex-box 属性等方法避免带有标签的换行。 使用内联属性…

      2025年12月21日
      000
    • 如何使用HTML和CSS创建定价表?

      我们可以只使用HTML和CSS来创建一个基本的定价表。定价表可以是在涉及商品购买的不同网站中实现的一个有用的功能,例如电子商务网站应用程序或旅行网站。让我们通过下面的示例来学习如何创建这样的表格 – 示例 我们将首先在以下index.html文件中创建一个HTML表格的布局,然后再添加样…

      2025年12月21日
      000
    • 在HTML中,不使用JS阻止图像可拖动或可选择的方法

      将以下代码片段添加到图像属性中,并防止图像被拖动和选择。 img { user-drag: none; user-select: none; -moz-user-select: none; -webkit-user-drag: none; -webkit-user-select: none; -ms…

      2025年12月21日
      000
    • 如何在JavaScript中将字符串转换为布尔值?

      您可以尝试运行以下命令来了解如何在 JavaScript 中将字符串转换为布尔值。 示例 实时演示 Convert String to Boolean var myString = “Amit”; document.write(“Boolean : ” + Boolean(myString)); 以…

      2025年12月21日
      000
    • 在JavaScript中,如何将”如何将数字转换为字符串?”翻译成中文

      使用 JavaScript 中的 String() 方法转换为字符串。您可以尝试运行以下命令来了解如何在 JavaScript 中将 [ ] 转换为字符串。 示例 实时演示 Convert [] to String var myVal = []; document.write(“String: ” …

      2025年12月21日
      000
    • 使用HTML和CSS创建霓虹文字显示

      如今,在网页上创建霓虹灯文本已成为一种使其更具吸引力的趋势。我们可以在网页上创建霓虹灯文字,以产生引人注目的效果,吸引用户对网页包含的重要信息的注意力。 我们可以使用带有徽标、标题、广告等的霓虹灯文本来突出显示它们。在本教程中,我们将自定义 text-shadow CSS 属性的值来创建霓虹灯文本。…

      2025年12月21日
      000
    • 设置HTML中图标的大小

      在本文中,我们将讨论如何在 HTML 中设置图标的大小。 图标是代表网页上特定操作的符号。 图标字体包含符号和字形。有几个图标库(字体)提供图标并可以在 HTML 网页上使用。 网络开发人员经常使用的突出图标字体是 Font Awesome、Bootstrap Glyphicons 和 Google…

      2025年12月21日
      000
    • 在HTML中,每当视频/音频的音量发生变化时执行脚本?

      onvolumechange 属性在用户更改网页上访问的视频或音频的音量时触发。这个改变可以是音量增大、音量减小、静音等。 示例 您可以尝试运行以下代码来实现 onvolumechange 属性 – Play Your browser does not support the video…

      2025年12月21日
      000

    发表回复

    登录后才能评论
    关注微信