Html 自定义标签

Html 自定义标签Html 自定义标签元素

Html 自定义标签

前言

customElements.define('user-line', Line,, { 
    extends: "ul" }); //{ extends: "ul" }为继承与非继承的差别 
class ExpandingList extends HTMLUListElement { 
    constructor() { 
    // 必须首先调用 super 方法 super(); // 元素的功能代码写在这里 ... } } 

如果是非继承,则extern HTMLElement.

这里主要介绍非继承的方式。

非继承的实现方法

js 代码如下

//方法1 不继承自原有的html class Line extends HTMLElement{ 
    constructor(){ 
    //类的构造函数constructor总是先调用super()来建立正确的原型链继承关系。 super(); //Shadow DOM 允许将隐藏的 DOM 树附加到常规的 DOM 树中——它以 shadow root 节点为起始根节点,在这个根节点的下方,可以是任意元素,和普通的 DOM 元素一样 //open 表示可以通过页面内的 JavaScript 方法来获取 Shadow DOM const shadow = this.attachShadow({ 
   mode: 'open'}); const divparent = document.createElement('div'); divparent.setAttribute('class','div_parent'); const doc_lable_sign_div = document.createElement('div'); doc_lable_sign_div.setAttribute('class','lable_sign'); doc_lable_sign_div.textContent="医生签名:"; this.doc_name_sign_div = document.createElement('div'); this.doc_name_sign_div.setAttribute('class','doc_name_sign_div'); const patient_lable_sign_div = document.createElement('div'); patient_lable_sign_div.setAttribute('class','lable_sign'); patient_lable_sign_div.textContent="患者签名:"; this.patient_name_sign_div = document.createElement('div'); this.patient_name_sign_div.setAttribute('class','patient_name_sign_div'); const style = document.createElement('style'); console.log(style.isConnected); const span1 = document.createElement('span'); span1.setAttribute('class','span'); const span2 = document.createElement('span'); span2.setAttribute('class','span'); const attr_doc = document.createAttribute("docname"); const attr_patient = document.createAttribute("patientname"); style.textContent = ` .div_parent{ display:flex; justify-content:flex-end; } .lable_sign{ font-style:italic; font-weight:bold; font-size:16px; } .doc_name_sign_div{ font-weight:normal; } .patient_name_sign_div{ font-weight:normal; } .span{ min-width:50px; } ` shadow.appendChild(style); console.log(style.isConnected); shadow.appendChild(divparent); divparent.appendChild(doc_lable_sign_div); divparent.appendChild(this.doc_name_sign_div); divparent.appendChild(span1); divparent.appendChild(patient_lable_sign_div); divparent.appendChild(this.patient_name_sign_div); divparent.appendChild(span2); } //指定观察属性,属性发生变化时调用 attributeChangedCallback static get observedAttributes() { 
    return ['docname', 'patientname']; } //当元素插入到 DOM 中时,connectedCallback()函数将会执行 connectedCallback(){ 
    console.log("..connectedCallback"); } attributeChangedCallback(name, oldValue, newValue) { 
    console.log(`element attributes changed. oldvalue:${ 
     oldValue} newValue:${ 
     newValue}`); switch(name){ 
    case 'docname': this.doc_name_sign_div.textContent=newValue; break; case 'patientname': this.patient_name_sign_div.textContent=newValue; break; } } } customElements.define('user-line', Line); 

代码说明:这里创建了二个属性

docname ,patientname

其中有对二个属性进行操作,留意这里

//指定观察属性,属性发生变化时调用 attributeChangedCallback static get observedAttributes() { 
    return ['docname', 'patientname']; } 
attributeChangedCallback(name, oldValue, newValue) { 
    console.log(`element attributes changed. oldvalue:${ 
     oldValue} newValue:${ 
     newValue}`); switch(name){ 
    case 'docname': this.doc_name_sign_div.textContent=newValue; break; case 'patientname': this.patient_name_sign_div.textContent=newValue; break; } } 

与下面html中的属性(docname,patientname)有关

<body> <user-line docname="Doc" patientname="xxxx"></user-line> </body> 

完整的Html代码如下,要注意的地方有注释(defer)

<!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> <!-- 必须在script标签上添加defer属性 --> <script src="./custom_elements1.js" defer></script> </head> <body> <user-line docname="Doc" patientname="xxxx"></user-line> </body> </html> 

显示效果

效果
在浏览器生成的元素
元素

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231783.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月21日 下午7:01
下一篇 2025年11月21日 下午7:22


相关推荐

  • layoutSubviews 和 drawRect

    layoutSubviews 和 drawRect转自http://justsee.iteye.com/blog/1886463UIView的setNeedsDisplay和setNeedsLayout方法。首先两个方法都是异步执行的。setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用lay

    2022年7月15日
    17
  • 1146 mysql_MySQL错误处理–1146错误「建议收藏」

    1146 mysql_MySQL错误处理–1146错误「建议收藏」在MySQL的主从复制过程中,出现了1146错误。提示的错误原因是:在默认的数据中找不到指定的表。showslavestatus\G;现实的同步状态。Slave_IO_Running:YESSlave_SQL_Running:NoLast_Errno:1146Last_Error:Error’Table’coop.Coop_Data’doesn’texist’onquery…

    2022年6月12日
    40
  • OpenClaw多Agent配置[项目源码]

    OpenClaw多Agent配置[项目源码]

    2026年3月13日
    2
  • Pycharm插件推荐

    Pycharm插件推荐相信对于不少的 Python 程序员们都是用 Pycharm 作为开发时候的 IDE 来使用的 今天小编来分享几个好用到爆的 Pycharm 插件 在安装上之后 你的编程效率 工作效率都能够得到极大地提升 安装方法插件的安装方法一点都不难打开 file settings plugins 在右侧的文本框中输入想要查看的插件名称 在下方就会罗列出已经安装的相关的插件找到我们所需要的对应插件之后 点击 install 即可完成下载 然后重启一下 Pycharm 即可接下来我们来看一下那些广受欢迎的 Pyc

    2026年3月27日
    2
  • ubuntu20.20安装pycharm2021详细教程(简单可用)

    ubuntu20.20安装pycharm2021详细教程(简单可用)ubuntu20 20 安装 pycharm2021 详细教程 简单可用 1 下载 Pycharm 附连接 https www jetbrains com pycharm download section linux 选 linux 社区版免费 2 下载后解压 文件在下载目录下 右键选择 提取到此处 3 提取目录地址解压后进入文件夹的 bin 目录内 然后右键空白区域点属性然后复制目录地址 4 安装 pycharm 打开 终端 输入 cd home xucong 下载 pycharm communi

    2026年3月27日
    2
  • 数据包发包工具bittwist「建议收藏」

    数据包发包工具bittwist「建议收藏」数据包发包工具bittwist

    2025年9月4日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号