前端如何监听的dom元素的变化

使用场景

在前端开发中,会有这样的两种场景

  • 承载3d场景或可视化的图表的canvas标签尺寸发生变化时,去做自适应重新渲染
  • 当某个文本在标签内显示溢出样式控制出现省略号,鼠标浮动需要出现完整提示

出现这种情况时,可以通过去监听dom元素的变化,去做相应的控制,来实现这种类似的功能

具体实例

以下实例均使用Vue3去实现

MutationObserver1

MutationObserver接口提供了监视对 DOM 树进行更改的能力。它被设计为旧的 Mutation Events 功能的替代产品,该功能是 DOM3 Events 规范的一部分。
下面是监听元素是否显示,从而控制按钮显隐的实例

<template>
	<div id="container">
		....
	</div>
	<button v-if="showBtn">按钮</button>
</template>

<script setup>
const showBtn = ref(false)
let observer = null
onMounted(()=>{
	const btn = document.getElementById('container')
	// 创建一个MutationObserver实例
	//mutationsList:变化节点属性的数组
	observer = new MutationObserver((mutationsList) => {
	    for (let mutation of mutationsList) {
	    	//type = attributes:中某节点的一个属性值被更改
	    	//type = childList:从树上添加或移除一个或更多的子节点
	        if (mutation.type = 'attributes' && mutation.attributeName == 'style') {
	            showBtn.value = btn.style.display = 'none'
	        }
	    }
	})
	
	// 开始监听属性变化
	observer.observe(btn, { 
		attributes: true // 是否监视正在监视的一个或多个节点上属性值的更改
	});
})
beforeDestory(()=>{
	//disconnect() 取消对所有dom的监听
	observer.disconnect()
	observer= null
})
<script>

ResizeObserve2

ResizeObserver 接口监视 Element 内容盒或边框盒或者 SVGElement 边界尺寸的变化。
下面是监听元素尺寸变化去重新渲染echart图表的实例

<template>
	<div ref="echartsCon" style="width:100%;height:100%"></div>
</template>
<script setup>
let resize0bserver = null
const echartsCon = ref(null)
onMounted(()=>{
	resize0bserver = new ResizeObserver(() => {
		// 元素尺寸发生变化时触发的事件
		// 用requestAnimationFrame则为让它在下一帧去执行重新渲染echart
	    requestAnimationFrame(() => {
	        if (echartsCon.value) {
	            this.chartChange();
	        }
	    });
	});
	// observe(target) target:需要观察的dom
	resize0bserver.observe(echartsCon.value);
})
// 组件被销毁前结束对dom的监听,销毁对象
beforeDestory(()=>{
	// unobserve(target) target:需要观察的dom
	// resize0bserver.unobserve(echartsCon.value)
	//disconnect() 取消对所有dom的监听
	resize0bserver.disconnect()
	resize0bserver = null
})
</script>

  1. MotationObserve文档 ↩︎

  2. ResizeObserve文档 ↩︎

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

路西高辣

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值