MutationObserver实时监控dom的变化

项目场景:

项目场景:我有个项目是用jQuery+layui实现的左侧的导航栏需要根据一个dom属性的变化实时收缩和展开,起初使用的监控不太灵敏,查资料发现MutationObserver可以实现


问题描述

在这里插入图片描述

提示:如图左侧的导航栏可以点击上方的回退图标收起和展开,也可以根据某些条件自动展开,所以会出现内容区和导航栏遮挡的情况,刚开始是如下代码是通过是通过模拟点击此图标LAY_app_flexible为收缩按钮的类,来判断设置内容区理左侧的距离left发现自动收起时不会触发这个就想到自动监控dom的变化

$(document).on('click', '#LAY_app_flexible', function(data) {
      var el=$("#LAY_app_flexible").hasClass("layui-icon-shrink-right")
      if(!el){
          $('#hu_hf').css({'background-image':'url(../../../Content/style/res/timg.png)','background-position': '5px'})
          $('.layui-body').css('left','60px')
      }else{
          $('#hu_hf').css({'background-image':'url(../../../Content/layui/images/tu/220x50.png)','background-position': '0 10px'})
          $('.layui-body').css('left','200px') 
      }
  });

解决方案:

提示:因为通过查看dom发现,当收起时,父元素LAY_app上的类会多一个类layadmin-side-shrink,所以监控父元素LAY_app

在这里插入图片描述
以下方法完美解决此遮挡问题。

var mut= new MutationObserver(function(a){
a.forEach(function(b){
     if($('#LAY_app').hasClass('layadmin-side-shrink')){
         $('#hu_hf').css({'background-image':'url(../../../Content/style/res/timg.png)','background-position': '5px'})
         $('.layui-body').css('left','60px')
     }else{
         $('#hu_hf').css({'background-image':'url(../../../Content/layui/images/tu/220x50.png)','background-position': '0 10px'})
         $('.layui-body').css('left','200px')
     }
 })
})
mut.observe($('#LAY_app')[0],{
   attributes:true,
   characterData:true,
   childList:true,
   subtree:true,
   attributeOldValue:true,
   characterDataOldValue:true,
})

总结

MutationObserver用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动都会触发MutationObserver事件。
但是,它与事件有一个本质不同:事件是同步触发,也就是说,DOM 的变动立刻会触发相应的事件;Mutation Observer 则是异步触发,DOM 的变动并不会马上触发,而是要等到当前所有 DOM 操作都结束才触发.

MutationObserver的相关api可借鉴:
MUtationObserver api

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 JavaScript 中的 MutationObserver API 来监控网页变化MutationObserver 是一个异步 API,它可以观察到 DOM 中的节点变化,并在变化发生时执行回调函数。 以下是一个简单的示例,演示如何使用 MutationObserver 监控网页内容变化: ```javascript // 选择要监控的节点 const targetNode = document.getElementById('some-node'); // 创建 MutationObserver 实例 const observer = new MutationObserver(mutationsList => { for (let mutation of mutationsList) { // 检测节点内容是否变化 if (mutation.type === 'childList' && mutation.target === targetNode) { console.log('节点内容发生变化:', mutation.target.textContent); } } }); // 配置 MutationObserver const config = { childList: true, subtree: true }; // 开始监控 observer.observe(targetNode, config); ``` 在上述代码中,我们首先选择要监控的节点 `targetNode`,然后创建 MutationObserver 实例 `observer`。接着,我们定义了一个回调函数,当节点内容发生变化时,会打印出变化的内容。然后,我们配置了 MutationObserver 的选项,设置为监控子节点的变化,并递归监控整个子树。最后,我们调用 `observer.observe()` 方法开始监控。 需要注意的是,MutationObserver 是异步 API,因此它无法保证所有变化都会被立即捕获。在某些情况下,可能会出现延迟或遗漏的现象。所以,如果你需要实时监控网页变化,最好使用其他更可靠的方法,例如 WebSocket 或长轮询等技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值