创建自定义标签以扩展 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)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    如何使用HTML创建参考文献?
    上一篇 2025年12月21日 21:53:01
    使用JavaScript RegExp查找数字
    下一篇 2025年12月21日 21:53:22

    相关推荐

    • 曝《最后生还者3》或于PS6世代中期推出 需等到2030年

      曝《最后生还者3》或于PS6世代中期推出 需等到2030年曝《最后生还者3》或于PS6世代中期推出 需等到2030年曝《最后生还者3》或于PS6世代中期推出 需等到2030年曝《最后生还者3》或于PS6世代中期推出 需等到2030年

      近一年前,顽皮狗正式揭晓了全新作品《星际:异端先知》,然而几个月后,工作室又透露正在秘密开发另一款尚未公开的游戏。《最后生还者》系列的核心人物尼尔·德鲁克曼(neil druckmann)曾表示,团队早在数年前便已着手构思该系列的第三部正统续作,暗示这一经典ip或将再度回归。 关于《最后生还者3》的…

      2026年10月5日 • 用户投稿
      200
    • 豆包人工智能在线入口 豆包人工智能网页版在线入口

      豆包人工智能在线入口 豆包人工智能网页版在线入口豆包人工智能在线入口 豆包人工智能网页版在线入口豆包人工智能在线入口 豆包人工智能网页版在线入口豆包人工智能在线入口 豆包人工智能网页版在线入口

      豆包的使用方法包括打开官方网页、注册登录、开始对话和获取答案。1. 打开网页:点击提供的链接进入豆包官网;2. 注册/登录:新用户注册或已有用户登录;3. 开始对话:在输入框提出问题或需求,如总结新闻、写文章或翻译;4. 获取答案:根据豆包的回复进一步提问或修改内容。豆包适用于信息查询、内容创作、学…

      2026年10月5日 • 用户投稿
      000
    • RayLink如何设置访问白名单_RayLinkIP地址过滤的安全配置指南

      首先启用设备连接验证并设置密码,再通过设备码或IP地址将受信任设备加入白名单,最后在Windows防火墙中配置入站规则,允许指定IP访问RayLink端口并阻止其他所有IP,实现双重安全防护。 如果您希望使用RayLink远程控制软件时,仅允许特定设备进行连接,以防止未经授权的访问,则需要配置IP地…

      2026年10月5日
      100
    • 光遇9.18免费魔法是什么-光遇9月18日免费魔法收集攻略

      光遇9.18免费魔法是什么-光遇9月18日免费魔法收集攻略光遇9.18免费魔法是什么-光遇9月18日免费魔法收集攻略光遇9.18免费魔法是什么-光遇9月18日免费魔法收集攻略光遇9.18免费魔法是什么-光遇9月18日免费魔法收集攻略

      每天玩家都可以在方舟处领取部分免费魔法,那么在9月18日当天有哪些可以免费获取的魔法呢?以下是光遇9.18免费魔法位置的详细信息,感兴趣的朋友千万别错过! 光遇9月18日免费魔法内容: 漂浮魔法 魔法工坊 位置:暮土 失落方舟 / 遇境小船 提示:解锁“魔法工坊”需先完成[魔法季]全部季节任务 魔法…

      2026年10月5日 • 用户投稿
      100
    • laravel Horizon怎么监控和管理队列_laravel Horizon队列监控与管理

      Laravel Horizon可解决队列延迟与失败问题,通过安装composer require laravel/horizon并发布配置文件,设置QUEUE_CONNECTION=redis;启动php artisan horizon服务后,结合Supervisor后台运行;访问/horizon界…

      2026年10月5日
      100
    • Android RecyclerView在屏幕旋转时数据重复叠加的解决方案

      Android RecyclerView在屏幕旋转时数据重复叠加的解决方案Android RecyclerView在屏幕旋转时数据重复叠加的解决方案Android RecyclerView在屏幕旋转时数据重复叠加的解决方案Android RecyclerView在屏幕旋转时数据重复叠加的解决方案

      本文旨在解决Android应用中RecyclerView在屏幕旋转等配置变更时出现数据重复加载和UI叠加的问题。核心在于理解Android生命周期中Activity和Fragment的重建机制,并通过检查savedInstanceState避免重复添加Fragment,同时利用ViewModel确保…

      2026年10月5日 • 用户投稿
      100
    • Yii框架中的ActiveDataProvider:便捷地获取数据

      在开发web应用程序的过程中,数据管理往往是一个重要的方面。%ignore_a_1%框架为此提供了许多强大的数据处理工具,其中一个就是activedataprovider。 ActiveDataProvider是一个查询数据模型、将结果按特定格式组织,并支持分页和排序的工具。它通常用于在Yii应用程…

      用户投稿 2026年10月5日
      000
    • 苹果手机没有设备管理怎么办

      苹果手机没有设备管理怎么办 问题解答: 如果苹果手机上没有设备管理,可以尝试以下步骤恢复: 详细解答: 乾坤圈新媒体矩阵管家 新媒体账号、门店矩阵智能管理系统 17 查看详情 检查设备类型:确保你的苹果手机不是公司或教育机构管理的设备。如果是,请联系相关管理员启用设备管理。重启设备:按住电源键和音量…

      2026年10月5日
      000
    • 比亚迪带头冲 中车厂5月英国市占率逼近10%创新高

      比亚迪带头冲 中车厂5月英国市占率逼近10%创新高比亚迪带头冲 中车厂5月英国市占率逼近10%创新高比亚迪带头冲 中车厂5月英国市占率逼近10%创新高比亚迪带头冲 中车厂5月英国市占率逼近10%创新高

      ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 中国车厂 5 月加大进军英国市场力道,市占率首次逼近 10%。与此同时,特斯拉 (TSLA-US) 英国销量年减 36%,凸显中国车厂正从美国电动车龙头手中抢夺市场。 根据英国汽车制造商和贸易商…

      2026年10月5日 • 用户投稿
      300
    • 教你解决笔记本win10键盘全部没反应

      教你解决笔记本win10键盘全部没反应教你解决笔记本win10键盘全部没反应教你解决笔记本win10键盘全部没反应教你解决笔记本win10键盘全部没反应

      你有没有遇到过笔记本windows 10键盘突然失灵的情况呢?最近有不少小伙伴在办公时遇到了这个难题,赶紧来向小编求助解决办法。别急,小编立刻整理了思路,接下来就跟着小编一起看看如何解决笔记本键盘全部没反应的问题吧! 第一步,我们先打开控制面板,接着点击“硬件和声音”。 第二步,在“硬件和声音”页面…

      2026年10月5日 • 用户投稿
      500
    • 怎样用免费工具做艺术PPT_免费艺术风格PPT的制作方法

      怎样用免费工具做艺术PPT_免费艺术风格PPT的制作方法怎样用免费工具做艺术PPT_免费艺术风格PPT的制作方法怎样用免费工具做艺术PPT_免费艺术风格PPT的制作方法怎样用免费工具做艺术PPT_免费艺术风格PPT的制作方法

      可借助轻竹办公PPT、Tome AI、PPT美化工具和Canva等免费工具制作艺术风格PPT;2. 轻竹办公基于清华智谱AI,输入主题如“印象派艺术展策划”,选艺术风模板,30秒生成含封面、目录的初稿,可预览调整后导出PPTX;3. Tome AI将描述性语句如“当代水墨艺术与数字媒介融合展示”转化…

      2026年10月5日 • 用户投稿
      000
    • JUnit 5 中实现测试方法依赖注入的实践指南

      JUnit 5 中实现测试方法依赖注入的实践指南JUnit 5 中实现测试方法依赖注入的实践指南JUnit 5 中实现测试方法依赖注入的实践指南JUnit 5 中实现测试方法依赖注入的实践指南

      本文详细阐述了如何在 JUnit 5 中通过参数化测试(@ParameterizedTest)和方法源(@MethodSource)实现对测试方法的依赖注入。通过这种方式,开发者可以向同一个测试方法提供不同类型的对象实例,从而在不修改测试逻辑的前提下,对多种变体进行测试,极大地提升了测试的灵活性和覆…

      2026年10月5日 • 用户投稿
      000
    • 70万粉博主摆拍后删视频拒道歉,被质疑“跑路”

      70万粉博主摆拍后删视频拒道歉,被质疑“跑路”70万粉博主摆拍后删视频拒道歉,被质疑“跑路”70万粉博主摆拍后删视频拒道歉,被质疑“跑路”70万粉博主摆拍后删视频拒道歉,被质疑“跑路”

      近日,四川达州一位早餐摊主唐女士因一则虚构短剧视频遭遇网络暴力。某平台拥有七十余万粉丝的博主“三水居士”在其摊位拍摄“讨食被泼水”的短剧,但未向摊主说明真实剧情,也未在发布时标注为演绎作品,导致唐女士被大量网友误解和攻击,生活与生意受到严重影响。 虚构视频引发风波 1、2025年8月31日,博主“三…

      2026年10月5日 • 用户投稿
      000
    • 宝塔面板:一键安装WordPress、Joomla等CMS

      宝塔面板是一款基于web的服务器管理软件,可以帮助用户在linux服务器上快速部署网站,应用程序和数据库。其中,宝塔面板的一项关键功能是一键安装各种开源cms,包括wordpress、joomla、drupal等。 对于一个不熟悉服务器管理的网站管理员来说,手动部署CMS是一项繁琐的任务。包括下载软…

      2026年10月5日
      100
    • 美团外卖满减券领取入口_美团外卖满减券使用攻略

      美团外卖满减券领取入口_美团外卖满减券使用攻略美团外卖满减券领取入口_美团外卖满减券使用攻略美团外卖满减券领取入口_美团外卖满减券使用攻略美团外卖满减券领取入口_美团外卖满减券使用攻略

      未使用满减券或未满足使用条件导致订单金额较高。可通过美团App首页活动、搜索关键词、完成任务及微信小程序等途径领取满减券,并在有效期内达到最低消费后使用以降低成本。 如果您在使用美团外卖时发现订单金额较高,可能是因为未使用平台提供的满减优惠券。通过领取并合理使用满减券,可以有效降低用餐成本。以下是具…

      2026年10月5日 • 用户投稿
      200
    • 全新小鹏P7和G7 Ultra全场景VLA将上车 何小鹏发布演示

      全新小鹏P7和G7 Ultra全场景VLA将上车 何小鹏发布演示全新小鹏P7和G7 Ultra全场景VLA将上车 何小鹏发布演示全新小鹏P7和G7 Ultra全场景VLA将上车 何小鹏发布演示全新小鹏P7和G7 Ultra全场景VLA将上车 何小鹏发布演示

      8月22日,小鹏汽车董事长何小鹏宣布:全新小鹏p7与g7 ultra将搭载全场景vla系统,标志着小鹏在智能驾驶领域迈入新阶段。他指出,小鹏全场景vla不仅具备高水准、高智慧,更在安全性上实现全面升级,并同步发布了一组该系统的实车演示画面。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费…

      2026年10月5日 • 用户投稿
      100
    • 告别繁琐手动集成:如何使用miloschuman/yii2-highcharts-widget轻松为Yii2应用添加交互式图表

      告别繁琐手动集成:如何使用miloschuman/yii2-highcharts-widget轻松为Yii2应用添加交互式图表告别繁琐手动集成:如何使用miloschuman/yii2-highcharts-widget轻松为Yii2应用添加交互式图表告别繁琐手动集成:如何使用miloschuman/yii2-highcharts-widget轻松为Yii2应用添加交互式图表告别繁琐手动集成:如何使用miloschuman/yii2-highcharts-widget轻松为Yii2应用添加交互式图表

      可以通过一下地址学习composer:学习地址 数据可视化之痛:Yii2 项目中图表集成的那些烦恼 在我们的Web应用开发中,展示数据报表和趋势图几乎是不可避免的需求。想象一下,你正在为一款管理系统开发一个数据仪表盘,需要展示用户的活跃度、销售额增长曲线,甚至是全球用户分布地图。Highcharts…

      2026年10月5日 • 用户投稿
      000
    • 《影之刃零》亮相未来游戏展 一小时试玩与全新PV!

      《影之刃零》亮相未来游戏展 一小时试玩与全新PV!《影之刃零》亮相未来游戏展 一小时试玩与全新PV!《影之刃零》亮相未来游戏展 一小时试玩与全新PV!《影之刃零》亮相未来游戏展 一小时试玩与全新PV!

      下周的游戏盛宴不仅有科隆游戏展开幕之夜,xbox 也将举办专场发布会(据传将公布 rog ally 掌机的 xbox 版发布日期)。此外,还有未来游戏展将作为科隆游戏展的一部分于北京时间8月21日02:00进行线上直播! 本次未来游戏展将带来超过50款游戏的展示,其中S-Game开发的武侠风动作砍杀…

      2026年10月5日 • 用户投稿
      000
    • 如果我将NULL提供给MySQL的ASCII()函数,它会返回什么?

      如果我将NULL提供给MySQL的ASCII()函数,它会返回什么?如果我将NULL提供给MySQL的ASCII()函数,它会返回什么?如果我将NULL提供给MySQL的ASCII()函数,它会返回什么?如果我将NULL提供给MySQL的ASCII()函数,它会返回什么?

      在这种情况下,ASCII()函数的输出取决于我们是否将NULL作为字符串提供,还是仅仅提供NULL。以下示例将演示区别− mysql> SELECT ASCII(null);+————-+| ASCII(null) |+————-+| NULL |+——…

      2026年10月5日 • 用户投稿
      000
    • 51漫画官网地址_51漫画网页版免费看

      51漫画官网地址_51漫画网页版免费看51漫画官网地址_51漫画网页版免费看51漫画官网地址_51漫画网页版免费看51漫画官网地址_51漫画网页版免费看

      51漫画官网地址是51manhua.vip/,该平台资源丰富,涵盖多种题材,更新及时,支持在线阅读与离线缓存,提供个性化阅读设置和良好社区互动体验。 51漫画官网地址在哪里?这是不少网友都关注的,接下来由php小编为大家带来51漫画网页版免费看的相关信息,感兴趣的网友一起随小编来瞧瞧吧! 1、☞☞☞…

      2026年10月5日 • 用户投稿
      000

    发表回复

    登录后才能评论
    关注微信