css样式隔离(iframe替代方案Shadow Root)

iframe替代方案、样式沙盒、影子dom、Shadow Root、渲染完成、事件绑定、节点属性改变

▍PART 序

  • 解决多套ui框架共存的痛点

  • 自由性、灵活性比iframe高。

  • 文中会提到渲染完成判断、改变内部节点属性、内部dom的事件绑定

  • 如果小伙伴发现问题,雪狼会在css样式隔离(iframe替代方案Shadow Root)的底部评论区说明、补充、纠正

  • web前端从业第14个年头了,哪天公众号不更新了,也希望大家莫怪

1.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<style>
			button {
				background: blue;
				color: #fff;
			}

			.btn {
				border: 1px red solid;
			}
		</style> <button class="btn">你好</button>
		<div id="btnDiv"> </div>
		<script>
			document.querySelector('.btn').onclick = () => {
				alert("1")
			}
		</script>
		<script>
			// 获取父节点			
			var hostElement = document.querySelector('#btnDiv');
			// 创建一个ShadowRoot			
			var shadowRoot = hostElement.attachShadow({
				mode: 'open'
			});
			shadowRoot.innerHTML =
				`<style>
					button {
					font-size:18px;
					}
				</style>			
				<button class="btn">插入的按钮</button>		  
				`;
		</script>
	</body>
</html>

Shadow Root是否渲染完成

<script>
	var upHtmlSize = 0
	//计算渲染次数
	// 创建 MutationObserver 监听 Shadow DOM 变化
	var observer = new MutationObserver((mutationsList) => {
		for (let mutation of mutationsList) {
			if (mutation.type === 'childList') {
				upHtmlSize += 1;
				if (upHtmlSize == 1) { //首次渲染完成
					console.log("渲染完成")
				}
			}
		}
	});
	observer.observe(shadowRoot, {
		childList: true,
		subtree: true
	});
</script>

Shadow Root内元素绑定事件click 


var shadowRoot = hostElement.shadowRoot;
// 在 Shadow Root 中查找元素
var shadowElement = shadowRoot.querySelector('button')
shadowElement.addEventListener('click', () => {
	alert('Shadow DOM 中的按钮被点击了!');
});

Shadow Root改变元素属性

加个计时器只是为了方便你看效果,你可以去掉


setTimeout(()=>{
	shadowElement.textContent = "改变了按钮名"
},1000)

▍PART 谷歌扩展插件开发对照表

  1. wxt插件安装、引用.scss

  2. content.ts注入js代码到页面、注入第三方库比如jquery

  3. 通讯对照表/popup、background通讯

  4. content和background、popup通讯

  5. inject和content通讯

  6. inject、content 、background、popup 分工

  7. popup引入vant-ui、改动tsconfig.json

  8. WxtStorage插件缓存

  9. axios接口请求

  10. 打开网页

  11. 打开插件内部页面

  12. 配vue-router路由

  13. 模拟用户click,解决isTrusted=false

  14. 模拟用户文本框输入

  15. 浏览器保留上次操作记录

PART 扩展阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪狼之夜

打个赏,让博主知道博文没白写

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值