Shadow Dom 是什么

概念

官方:https://developer.mozilla.org/zh-CN/docs/Web/API/Web_components/Using_shadow_DOM
核心:影子 DOM(Shadow DOM)允许你将一个 DOM 树附加到一个元素上,并且使该树的内部对于在页面中运行的 JavaScript 和 CSS 是隐藏的

如何创建 Shadow DOM

下面的页面包含两个元素,一个 id 属性为 “host” 的

元素,以及一个包含了一些文本的 元素:

<div id="host"></div>
<span>I'm not in the shadow DOM</span>

我们将把 Shadow DOM 插入到 id=host 的元素上

const host = document.querySelector("#host");
// 创建一个 shadow dom,  open 表示dom内部的细节是可见的
const shadow = host.attachShadow({ mode: "open" });  
// 创建 span 并添加文本
const span = document.createElement("span");
span.textContent = "I'm in the shadow DOM";
// 将 span 元素插入到 shadow dom
shadow.appendChild(span);

界面效果是这样的:
在这里插入图片描述
如果页面中代码有功能代码,会将文本设置为大写
则不会影响到 shadow dom 的文本
在这里插入图片描述

DEMO:

需求:

  • 使用fetch拿到本地的html文件,并将 html 解析为DOM
  • 将解析后的内容插入到 shadowRoot
import React, { useEffect, useRef, useState } from 'react';
import './App.css';function App() {const container = useRef(null);const [html, setHtml] = useState(null)const fetchHTML = () => {// 使用 fetch 加载 HTML 文件fetch(`${process.env.PUBLIC_URL}/demo.html`).then(response => {if (!response.ok) {throw new Error('Network response was not ok');}return response.text(); // 将响应处理为文本}).then(html => {setHtml(html)// 将html解析为domconst parser = new DOMParser();const doc = parser.parseFromString(html, 'text/html');//创建 shadowRootconst container = document.getElementById('host');const shadowRoot = container.attachShadow({ mode: 'open' });// 由于样式隔离 需要单独提取style 再插入// Shadow DOM 的样式是封闭的,需要显式地将样式添加到 Shadow DOM 中const styles = doc.querySelectorAll('style');styles.forEach(style => {shadowRoot.appendChild(style.cloneNode(true));});// 将解析后的内容插入到 shadowRoot 中while (doc.body.firstChild) {shadowRoot.appendChild(doc.body.firstChild);}}).catch(error => {console.error('There was a problem with the fetch operation:', error);});}fetchHTML()return (<div className="App"><div className="left"><pre><code>{html}</code></pre></div><div id='host' className="right" ref={container}></div></div>);
}export default App;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Proxyless的多活流量和微服务治理

1. 引言 1.1 项目的背景及意义 在当今的微服务架构中&#xff0c;应用程序通常被拆分成多个独立的服务&#xff0c;这些服务通过网络进行通信。这种架构的优势在于可以提高系统的可扩展性和灵活性&#xff0c;但也带来了新的挑战&#xff0c;比如&#xff1a; 服务间通信的复…

合碳智能 × Milvus:探索化学合成新境界——逆合成路线设计

合碳智能&#xff08;C12.ai&#xff09;成立于2022年&#xff0c;致力于运用AI和具身智能技术&#xff0c;为药物研发实验室提供新一代智能化解决方案&#xff0c;推动实验室从自动化迈向智能化&#xff0c;突破传统实验模式与人员的依赖&#xff0c;解决效率和成本的瓶颈&…

电脑错误mfc140.dll丢失怎么办?mfc140.dll丢失如何修复?

在使用基于Microsoft Visual Studio 2015开发的应用程序时&#xff0c;可能会遇到个别组件影响整体功能的情况&#xff0c;其中“mfc140.dll丢失”错误就是常见的一个技术障碍。这个DLL文件属于Microsoft Foundation Class (MFC) Library&#xff0c;它对Windows应用程序的运行…

MySQL record

更改密码&#xff1a; alter user rootlocalhost identified with mysql_native_password by ‘123456’; 注意&#xff1a; 在命令行方式下&#xff0c;每条MySQL的命令都是以分号结尾的&#xff0c;如果不加分号&#xff0c;MySQL会继续等待用户输入命令&#xff0c;直到MyS…

【C++】STL—vector的使用

目录 前言vector的常见构造迭代器的使用vector空间增长问题vector的增删查改尾插和尾删findinsert和erase 前言 vector是表示可变大小数组的序列容器。它就像数组一样&#xff0c;采用连续的存储空间来存储元素&#xff0c;且它的大小可以动态改变。并且vector在访问元素时也非…

AI语音机器人:通过 Azure Speech 实现类人类的交互

语音对话的重要性 在竞争日益激烈的客户互动领域&#xff0c;人工智能语音对话正成为重中之重。随着数字参与者的崛起&#xff0c;组织认识到语音机器人的强大力量&#xff0c;它是一种自然而直观的沟通方式&#xff0c;可以提供类似人类的体验&#xff0c;深度吸引用户&#…

jmeter中上传文件接口,当文件名为中文时出现乱码

1、在jmeter5.1.1中配置上传文件接口&#xff0c;当上传的文件为中文名称时&#xff0c;文件名称会显示乱码如图 2、解决方案是需要更换jmeter/lib/ext文件中的ApacheJMeter_http.jar 包 3、更换jar包经过多次实验&#xff0c;发现有的上传文件接口中文名正常&#xff0c;但是有…

负载均衡--资源申请说明(三)

1.负载方式&#xff1a;分为四层负载和七层负载 2.负载协议&#xff1a;四层负载为TCP和UDP&#xff0c;七层负载为HTTP和HTTPS 4.负载端口&#xff1a;填写虚地址的端口&#xff08;一般与后端服务端口保持一致&#xff09; 5.真实服务IP&#xff1a;指被负载的后台真实服务…

从零开始:理解并实践Prompt Flow

在人工智能领域中&#xff0c;代码先行与模型紧密结合的Prompt Flow逐渐成为开发者关注的新焦点。今天&#xff0c;我们将共同探索如何快速启动Prompt Flow项目&#xff0c;深入了解流&#xff08;flow&#xff09;的概念&#xff0c;并学习如何使用VS Code Extension或YAML来编…

基于Python的机器学习系列(26):PyTorch中的梯度计算

在本篇中&#xff0c;我们将探讨PyTorch的autograd功能&#xff0c;它为张量操作提供自动微分。我们将学习如何使用torch.autograd工具计算梯度并进行反向传播。 自动微分&#xff08;Autograd&#xff09; PyTorch的autograd包自动计算张量的梯度。当一个张量的.requires_gra…

C++和Python混合编程——C++调用Python入门

大纲 代码结构初始化 Python 解释器获取 GIL为什么需要 GIL&#xff1f;GIL 的影响 导入 Python 模块并执行代码释放 GIL终止 Python 解释器 完整代码编译执行结果项目地址 在《C和Python混合编程——Python调用C入门》一文中&#xff0c;我们熟悉了Python调用C编译的动态库的方…

集成电路学习:什么是PWM脉冲宽度调制

一、PWM&#xff1a;脉冲宽度调制 PWM&#xff0c;全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;是一种通过调整脉冲信号的宽度来控制电路输出的技术。在PWM中&#xff0c;信号的输出由一系列等幅值的脉冲组成&#xff0c;这些脉冲的宽度根据…

上海亚商投顾:深成指、创业板指均涨超1%,华为产业链反复活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 大小指数昨日走势分化&#xff0c;沪指全天震荡调整&#xff0c;2800点失而复得&#xff0c;深成指、创业板指…

golang

一.go执行流程 4&#xff09;go run运行时间明显要比第一种时间长一点 【3】编译后的文件可以替换名称 二.语法注意 1.源文件以“go”为扩展名 2.程序的执行入口是main&#xff08;&#xff09;函数。 3.严格区分大小写 4.方法由一条条语句构成&#xff0c;每个语句后不需…

Docker安全

Docker安全 和本地共享资源&#xff0c;会有安全性问题 1. Cgroups 对资源的上限进行控制 /sys/devices/system1.1 cpu资源限制 # 进行cpu控制&#xff0c;只使用20%的资源 docker run -it --rm --cpu-period 100000 --cpu-quota 20000 ubuntu# 测试cpu使用 dd if/dev/zer…

【题目全解】蓝桥杯24省赛C++中高级组题干题解

本帖只提供六道编程题的解题思路&#xff0c;部分题目并不提供实际的代码&#xff08;因为我赛时忘记把代码截图下来了&#xff09;。 T1 - 看书 题干描述&#xff1a; 一本书共 n n n 页&#xff0c;小明计划第一天看 x x x 页&#xff0c;此后每一天都要比前一天多看 y y…

【面试八股总结】MySQL 锁:全局锁、表级锁、行级锁

1. 全局锁 顾名思义&#xff0c;全局锁就是对整个数据库实例加锁。 MySQL 提供了⼀个加全局读锁的方法&#xff1a; flush tables with read lock 释放全局锁&#xff0c;执行命令&#xff1a; unlock tables 需要让整个库处于只读状态的时候&#xff0c;可以使用全局锁命…

鸿蒙(API 12 Beta6版)图形【NativeImage开发指导 (C/C++)】方舟2D图形服务

场景介绍 NativeImage是提供Surface关联OpenGL外部纹理的模块&#xff0c;表示图形队列的消费者端。开发者可以通过NativeImage接口接收和使用Buffer&#xff0c;并将Buffer关联输出到OpenGL外部纹理。 针对NativeImage&#xff0c;常见的开发场景如下&#xff1a; 通过Nati…

linux系统中USB模块鼠标驱动实现

各位开发者大家好,今天主要给大家分享一下,Linux系统中使用libusb的方法以及鼠标驱动实现。 第一:libusb概述 参考网址:* libusb GIT仓库:https://github.com/libusb/libusb.git * libusb 官网:https://libusb.info/ * libusb API接口:https://libusb.sourceforge.io/…

mysql 使用 general 开启SQL跟踪功能

查看当前状态 mysql> SHOW VARIABLES LIKE %general%; 启用 临时启用 SET GLOBAL general_logon; SET GLOBAL general_log_file/tmp/general.log; 永久启用 通过修改配置文件来启用,需要重启mysql服务 [mysqld] general_logON general_log_file/tmp/general.log 再次查看状态…