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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值