Web组件

news2024/11/26 23:38:02

 开发者使用Vue、React等框架来使用及创建定制的组件,Web组件是浏览器原生支持的替代这些框架的特性,主要涉及相对比较新的三个Web标准。这些Web标准允许JS使用新标签扩展HTML,扩展后的标签就是自成一体的、可重用的UI组件。

 1 HTML模版

DocumentFragment是一种Node类型,可以临时充当一组同辈节点的父节点,方便将这些同辈节点作为一个单元来使用。可以使用document.createDocumentFragment()来创建DocumentFragment节点。创建DocumentFragment节点后,可以像使用Element一样。

DocumentFragment与Element的区别是在于它没有父节点,当向文档中插入DocumentFragment节点时,DocumentFragment本身并不会被插入,实际上插入的是它的子节点。

1.1 <template>标签

<template>标签及其子元素永远不会被浏览器渲染,其对应的是一个HTMLTemplateElement对象,这个对象只定义了一个content属性,该属性值是包含<template>所以子节点的DocumentFragment。

可以深度克隆这个DocumentFragment,然后把克隆的副本插入文档中需要的地方。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<template id="tep">
  <div class="grid"></div>
</template>
<div class="block">
  <span>hello block</span>
</div>
</body>
<script>
  let tep = document.querySelector("#tep");
  let block = document.querySelector(".block");
  block.append(tep.content.cloneNode(true));//深度克隆
  block.append(tep.content.cloneNode(true));
</script>
</html>
<style>
  .grid{
    width: 50px;
    height: 50px;
    background: blue;
    margin: 10px;
  }
</style>

2 自定义元素

customElement.define()方法用来自定义元素。第一个参数是标签名(必须包含一个连字符),第二个参数是HTMLElement的子类。

浏览器会自动调用自定义元素类的特定“生命期方法”,当自定义元素被插入文档时,会调用connectedCallback()方法;当自定义元素从文档中被移除时会调用disconnectedCallback()方法。

如果自定义元素定义了静态的observedAttributes属性,其值为一个属性名的数组,且如果任何这些命名属性在这个自定义元素的一个实例上被设置(或修改),浏览器会调用attributeChangeCallback()方法。这个回调可以根据属性值的变化采取必要的步骤以更新组件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button onclick="createCus()">添加元素</button>
<button onclick="removeCus()">移除元素</button>
<button onclick="addSize()">增加尺寸</button>
<button onclick="changeColor()">修改颜色属性</button>
<div id="block"></div>
</body>
</html>

<script>
    class CustomCircle extends HTMLElement {
        connectedCallback() {
            this.style.borderRadius = "50%";
            this.style.border = "solid black 1px"
            this.style.display = "block"
            this.style.width = "50px";
            this.style.height = "50px";
            this.classList.add("custom")
            this.customSize = 50;
            console.log("元素被添加到文档");
        }

        disconnectedCallback() {
            console.log("元素被移除");
        }

        static get observedAttributes() {
            return ["cus"];
        }

        get size() {
            return this.customSize;
        }

        set size(val) {
            this.customSize = val;
            this.style.width = val + "px";
            this.style.height = val + "px";
        }

        attributeChangedCallback(name,oldVal,newVal) {
            this.style.background = newVal;
            console.log(name,oldVal,newVal);
        }
    }

    customElements.define("custom-circle",CustomCircle);

    function createCus() {
        let cus = new CustomCircle();
        document.querySelector("#block").append(cus);
    }

    function removeCus() {
        let cus = document.querySelector(".custom")
        if (cus)  cus.remove();
    }

    function addSize() {
        let cus = document.querySelector(".custom")
        if (cus) {
            cus.size = cus.size + 10;
        }
    }

    function changeColor() {
        let cus = document.querySelector(".custom")
        cus.setAttribute("cus","yellow");
    }

</script>

2.1 组件渲染过程

浏览器在解析HTML文档时,当在Web组件还没有定义就遇到其标签时,浏览器会向DOM树中添加一个通用的HTMLElement,即便它们不知道要对它做什么。之后,当自定义元素有定义之后,这个通用元素会被“升级”,从而具备预期的外观与行为。

如果Web组件包含子元素,那么在组件有定义之前它们可能会被不适当地显示出来。可以使用下面的CSS将Web组件隐藏到它们有定义为止。(:not(:defined))。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<cus-ele>
    <span>hello</span>
</cus-ele>
<cus-ele class="cus">
    <span>hello</span>
</cus-ele>
</body>
</html>

<style>
.cus:not(:defined) {
    opacity: 0;
}
</style>

3 影子DOM

Shadom DOM为封装而生,它可以让一个组件拥有自己的“影子”DOM树,这个DOM树不能在主文档中被任意访问,可能拥有局部样式规则,还有其他特性。

3.1 在浏览器中查看组件的影子DOM

浏览器在内部使用DOM/CSS来绘制影子DOM,这个DOM结构一般对用户是隐藏的,但我们可以开发者工具中看见它。在Chrome中,需要打开“Show user agent shadow DOM”选项。

图 <video>标签的影子DOM

我们不能使用一般的JS调用或者选择器来获取shadow DOM 元素,它们不是常规的子元素,而是一种封装手段。

3.2 为元素添加影子DOM

影子DOM允许把一个“影子根节点”附加给一个常规的HTML元素(或自定义元素),后者被称为“影子宿主”(shadow host)。

attachShadow方法是为常规元素附加一个影子根节点,其参数为一个ShadowRootInit类型的对象,其返回一个影子根节点。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="block"></div>
</body>
</html>

<script>
    class CustomEle extends HTMLElement {
        connectedCallback() {
            this.style.display = "block";
            this.style.width = "100px";
            this.style.height = "100px";
            this.style.border = "solid black 1px";
            let shadow = this.attachShadow({mode: 'closed'})
            shadow.innerHTML = "<div>hello shadow</div>"
        }
    }
    customElements.define("custom-ele",CustomEle);
    let cus = new CustomEle();
    document.querySelector(".block").append(cus);
    console.log(cus.shadowRoot); //如果mode 为open则有值,否则为空
</script>

3.2.1 影子DOM封装

1,在创建影子根节点并将其附加于影子宿主时,可以指定其模式开放还是关闭,关闭的影子根节点将被完全封闭,不可访问。如果开放,意味着影子宿主会有一个shadowRoot属性,js可以通过这个属性来访问影子根节点元素。

2,影子根节点下定义的样式不会影响外部的阳光DOM元素,类似地,影子宿主元素的阳光DOM样式也不会影响影子根节点。

3,影子DOM中发生的某些事件(如”load”)会被封闭在影子DOM中,另一些事件,如focus、mouse和键盘事件则会向上冒泡,穿透影子DOM。当一个发源于影子DOM内的事件跨过边界向阳光DOM传播时,其target属性会变成影子宿主元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1182543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构大体体系

逻辑结构 线性结构线性表一串珠子用线连起来&#xff0c;这就是典型的“线性存储结构”。每颗珠子之间的关系结构也很简单&#xff0c;包括头尾的话&#xff0c;它们最少有一个关系对象&#xff0c;而中间的珠子无论前后都只有一个关系对象&#xff0c;即 one-to-one栈队列字符…

webgoat-Sensitive Data Exposure 敏感信息泄露

insecure login不安全的登录 Encryption is a very important tool for secure communication 0x02 点击login&#xff0c;可以看到payload里的username和password&#xff0c;输入后点击submit即可。 这题的目的是说明&#xff0c;信息传输过程中需要加密&#xff0c;如不…

【C语言 | 符号】C语言中符号易出错的地方

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

一次简单的测试

文章现写的&#xff0c;部分内容有些着急 0x01 测试过程 开局登录框&#xff0c;没有测试SQL注入与XSS(菜鸟&#xff0c;测也测不出来。) 有system用户&#xff0c;尝试弱口令&#xff0c;无果&#xff01; 直接namp来一下子端口探测吧 发现有3306与8888 3306 mysql测试 88…

python 之异常处理结构

文章目录 常见的异常处理表现形式1. SyntaxError2. NameError3. TypeError4. IndexError5. KeyError6. ZeroDivisionError7. FileNotFoundErrortry……except …… 结构1. try 块2. except 块示例&#xff1a;多个except块try……except ……else 结构结构说明&#xff1a;示例…

注册电气工程师(供配电)专业考试大纲纯干货分享

1.法律法规与工程管理 1.1熟悉我国工程勘察设计中必须执行法律、法规的基本要求&#xff1b; 1.2熟悉了解工程勘察设计中必须执行建设标准强制性条文的概念&#xff1b; 1.3了解我国工程项目管理的基本概念和项目建设法人、项目经理、项目招标与投标、项目承包与分包等基本要素…

MySQL 数据目录和 InnoDB 表空间补充知识:详细结构

1. 数据目录 在Ubuntu下&#xff0c;MySQL的数据目录为/var/lib/mysql 1.1 数据库在文件系统中的表示 &#xff08;1&#xff09;创建数据库时&#xff0c;会在数据目录下创建一个与数据库名同名的子目录。&#xff08;除了information_schema这个系统数据外&#xff09; &…

AVS3:双向梯度修正BGC

双向梯度修正&#xff08;Bi-directional Gradient Correction&#xff0c;BGC&#xff09;是利用双向参考块间的差值对预测值进行修正的技术。 BGC仅用于双向预测CU&#xff0c;设两个方向得到的单向预测值分别为pred0和pred1&#xff0c;修正前的双向预测值为predBI&#xf…

看完这篇,医学小白也能轻松玩转文献查阅

对医学生而言&#xff0c;文献查询是写论文必不可少的一环。然而这实在是一件重要但又心累的事情。你是否每次查找文献&#xff0c;都感觉自己在进行无意义的重复劳动&#xff1b;一天下来全在搜索、下载、保存&#xff1b;搜索引擎给出的结果太多太杂&#xff0c;或者找不到全…

linux C++实现线程绑定CPU

前言 嵌入式里面我们会使用到多核的cpu&#xff0c;随着产品芯片性能提升&#xff0c;我们也会有很多功能&#xff0c;以及很多进程产生运行&#xff0c;这个时候我们在任务调度调优的时候&#xff0c;把一些进程绑定到固定cpu运行&#xff0c;下面就来分享一下cpu绑定运行的过…

ubunt18.04.4 安装petalinux2022.2

安装Petalinux需要许多依赖&#xff1a; 安装下面的工具&#xff1a; sudo apt-get install net-tools sudo apt-get install xterm sudo apt-get install autoconf sudo apt-get install libtool sudo apt-get install texinfo sudo apt-get install zlib1g-dev sudo apt-get…

Android Studio报错:connect refused

参考链接&#xff1a; https://blog.csdn.net/qq_43213783/article/details/113936012 参考文章中说报错主要是由于代理导致的&#xff0c;在文件->设置->外观与行为->系统设置->HTTP代理。 方法一&#xff1a; 查看打开代理&#xff08;前提是代理可以通网&#x…

混沌系统在图像加密中的应用(小波混沌神经网络)

混沌系统在图像加密中的应用&#xff08;小波混沌神经网络&#xff09; 前言一、小波混沌神经网络模型二、拓展三、python代码 前言 小波混沌神经网络是一种神经网络模型&#xff0c;结合了小波变换和混沌理论&#xff0c;用于信号处理、分类和预测。该模型基于多层前向神经网…

经典OJ题:单链表相交

目录 题目&#xff1a; 链表相交&#x1f34c;的概念&#xff1a; 单链表相交&#x1f34c;主要的问题&#xff1a; 思路的分析&#x1f34c;&#xff1a; 问题的回答&#xff1a; 如何判断相交&#x1f34c;&#xff1a; 如何寻找交点&#x1f34c;&#xff1a; 代码演…

独立云厂商市场份额第一 | 云轴科技ZStack位居IDC云系统软件市场报告第一梯队

近日&#xff0c;全球IT市场研究和咨询公司IDC发布《中国云系统软件市场跟踪报告2023H1》报告&#xff0c;报告显示2023年上半年中国云系统软件整体市场规模达到24.08亿元&#xff0c;同比增长16.4%。其中&#xff0c;云轴科技ZStack 作为产品化的云基础软件提供商&#xff0c;…

Leetcode-206 反转链表

迭代法&#xff1a;将指针方向依次改变&#xff0c;定义两个指针pre和cur /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, Lis…

如何找出最优的【SVC】核函数和参数值—以乳腺癌数据集为例

在实际的工作中&#xff0c;有的时候我们不知道数据特征&#xff0c;也不知道我们的数据是线性还是非线性。因此我们需要对数据一步步进行摸索&#xff0c;来找到最优的核函数和参数值。接下来我们以sklearn乳腺癌数据集为例。 先来导入相应的模块&#xff1a; from sklearn.d…

solidworks安装时,出现这个错误:无法获得下列许可SOLIDWORKS Standard.无效的(不一致的)使用许可号码。(-8,544,0)

问题描述&#xff1a;在安装SolidWorks2023时&#xff0c;按照软件管家中的步骤&#xff0c;但是在打开SolidWorks2023桌面上的快捷键时&#xff0c;出现了这个错误&#xff1a; 无法获得下列许可SOLIDWORKS Standard.无效的&#xff08;不一致的&#xff09;使用许可号码。(-…

一文1600字使用Postman搞定各种接口token实战(建议收藏)

现在许多项目都使用jwt来实现用户登录和数据权限&#xff0c;校验过用户的用户名和密码后&#xff0c;会向用户响应一段经过加密的token&#xff0c;在这段token中可能储存了数据权限等&#xff0c;在后期的访问中&#xff0c;需要携带这段token&#xff0c;后台解析这段token才…

‘vue’不是内部或外部命令,也不是可运行的程序或批处理文件

vue不是内部或者外部命令 今天打算重新创建一个vue项目&#xff0c;结果一直创建不了&#xff0c; 于是我就npm uninstall -g vue/cli怀疑是cli版本的问题&#xff0c;结果删了过后想要重新安装变一直卡在sill idealTree buildDeps 然后就直接vue不是内部或外部命令了 然后我…