头图

使用场景

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

  • 承载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>

luxigaola
159 声望5 粉丝

开发者路西高辣