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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • coreseek_coreone

    coreseek_coreoneSQL结构化查询语言(是一种标准,所有的关系型数据库Mysql,sqlserver,oracle)sphinx的使用两种方式:第一种:使用sphinx的API来操作sphinx(常用)sphi

    2022年8月2日
    8
  • url转换成二维码_地址转化为二维码

    url转换成二维码_地址转化为二维码前言根据公司业务需求,需要将指定的url催缴二维码,于是有了以下总结,作为一个记录,以便以后可以用到哦!一、将url直接生成二维码packagecom.xiaojukeji.it.common.util;importcom.google.zxing.BarcodeFormat;importcom.google.zxing.EncodeHintType;importcom.go…

    2025年9月19日
    4
  • 全自动回复机器人_微信群机器人哪个好用

    全自动回复机器人_微信群机器人哪个好用本文转自:https://mp.weixin.qq.com/s?__biz=MzAxMjUyNDQ5OA==&amp;amp;amp;mid=2653558126&amp;amp;amp;idx=1&amp;amp;amp;sn=b1a87e62fc2ae0a3b2e775dadf263ccc&amp;amp;amp;chksm=806e3bd3b719b2c5a83684476a5b33f341c72b4b4399153ee3a2466a83c43d3b1b…

    2022年9月28日
    3
  • nginx 实现动静分离访问项目资源

    nginx 实现动静分离访问项目资源nginx动静分离访问可以将一些css,js,img,html等一些静态资源没必要去让tomcat去加载好处是减少tomcat压力,提高响应速度,让tomcat只去处理跟数据库打交道的请求项目结构(图片) 1页面图片展示  2nginx.confg配置  #设置tomcat集群 upstreamlocal{ #i…

    2022年5月29日
    31
  • 美国100部推理小说排行榜第一_好看的悬疑小说排行榜前十名

    美国100部推理小说排行榜第一_好看的悬疑小说排行榜前十名这份书单是美国推理作家协会(TheMysteryWritersofAmerica,简称MWA)票选出来的史上最经典的一百部推理小说排行榜。评选过程极为复杂,首先由推理协会选出本格派、硬汉派、惊悚派、间谍小说等推理小说十个主要流派的十个代表作家,再由这十个作家选出各流派的十部代表作品,然后由协会会员投票排出名次。所以这份书单不仅仅有总的一百强排行榜,还有各个不同流派的十大杰作排名,其中本格和…

    2022年9月28日
    4
  • SSDP 协议_Smb协议

    SSDP 协议_Smb协议1.组播地址2.SSDP,简单服务发现技术组播地址为了让组播源和组播组成员进行通信,需要提供网络层组播地址,即IP组播地址。同时必须存在一种技术将IP组播地址映射为链路层的组播MAC地址。1.IP组播地址(1)       IPv4组播地址IANA(InternetAssignedNumbersAuthority,互联网编号分配委员会)将D类地址空间分配给IP

    2022年10月11日
    2

发表回复

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

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