首页 > 其他分享 >MutationObserver监听DOM结构变化

MutationObserver监听DOM结构变化

时间:2024-02-29 20:04:15浏览次数:20  
标签:el form DOM filterObserver MutationObserver toggleFilter ngtpAdapt 监听

前面有IntersectionObserver观察器实现页面懒加载的功能,原理就是观察dom是否进入视口。那么如果不管是否可见或者要实现随时监听,则需要使用MutationObserver。

示例代码:

 1 filterObserve: function(_id) {
 2         if ($("#"+_id+" form t-form-item").length<5) return null
 3         //选择一个需要观察的节点
 4         var targetNode = document.getElementById(_id);
 5      // var targetNode = document.getElementsByClassName('query-searchBox')[0]//多页面
 6         // 设置observer的配置选项
 7         var config = { childList: true,attributes: false, subtree: true//, characterData: true
 8         };
 9 
10         // 当节点发生变化时的需要执行的函数
11         var callback = function(mutationsList, observer) {
12             for(var mutation of mutationsList) {
13                 if (mutation.type == 'childList') {
14                     // console.error('A child node has been added or removed.');
15                     // 已展开,直接不设最大高度(或者500)
16                     if ($(".searchBox-box .icon-retract")[0]) {
17                         $("#"+_id).css("max-height", 'unset')
18                     }
19                     else// 已折叠,只计算第一行的高度
20                     if ($(".searchBox-box .icon-retractno")[0]) {
21                         var mHeight = 0
22                         $("#"+_id+" form t-form-item").each((index, el)=>{// TODO,待优化,提示文字内容变化的情况下,怎么获取到变化前的高度?变化后大,则不再遍历;变化后小,则遍历
23                             if ($(el).find('t-form-explain')[0] && index<4) {
24                                 mHeight = Math.max(mHeight, $(el).find('t-form-explain').height())
25                             }
26                         })
27                         $("#"+_id).css("max-height", 36+mHeight+'px')//$("#querySearchBox").height()
28                     }
29                 }
30             }
31         };
32 
33         // 创建一个observer示例与回调函数相关联
34         var observer = new MutationObserver(callback);
35 
36         //使用配置文件对目标节点进行观测
37         observer.observe(targetNode, config);
38         return observer
39     },
40     filterDisObserve: function(observer) {
41         if (observer) observer.disconnect();
42     }

背景:

监听搜索框内的dom变化,以便动态调整框的高度。因为有展开和折叠的功能,所以使用动态调整高度的方案(也可以通过显示或隐藏可折叠区来控制,如此一来就不需要关心高度计算问题了,相对更加合理,后边有该方案的改法)。

使用:

在页面dom加载完成后建立观察者,在页面销毁时进行注销

1 ngAfterViewInit() {
2     // this.toggleFilter()
3     this.filterObserver = ngtpAdapt.filterObserve("querySearchBoxCommonList")
4   }
5   ngOnDestroy() {
6     ngtpAdapt.filterDisObserve(this.filterObserver)
7   }

方案二:

去除高度限制,在展开折叠时控制第4项之后的表单元素的显隐

 1 ngAfterViewInit() {
 2     this.toggleFilter()
 3     // this.filterObserver = ngtpAdapt.filterObserve("querySearchBoxCommonList")
 4   }
 5   // ngOnDestroy() {
 6   //   ngtpAdapt.filterDisObserve(this.filterObserver)
 7   // }
 8   toggleFilter() {
 9     ngtpAdapt.showHideFilter(this.showQueryMore=!this.showQueryMore)
10   }
1 showHideFilter: function(bol) {
2         $(".query-searchBox form t-form-item").each((index, el)=>{
3             if (index>3) {
4                 $(el)[bol?'show':'hide']()
5             }
6         })
7     }

 

IntersectionObserver 

标签:el,form,DOM,filterObserver,MutationObserver,toggleFilter,ngtpAdapt,监听
From: https://www.cnblogs.com/ljwsyt/p/18045323

相关文章

  • 前端学习-vue学习003-事件监听
    教程链接使用v-on指令监听DOM事件<buttonv-on:click="increment">{{count}}</button>简写语法<button@click="increment">{{count}}</button><scriptsetup>import{ref}from'vue'constcount=ref(0)......
  • el-tootip在只有超出显示省略号时启用在树形组件(带循环dom)的运用
    原理就是在鼠标浮动到el-tootip包裹的元素时判断该元素的scrollWidth(元素内容的实际宽度)有没有超过clientWidth(元素的可是宽度)超出时显示省略号并设置disabled属性为false否则为true代码如下:链接:https://www.jianshu.com/p/b39d2124d911<el-treeref="treeRef......
  • Qt 随机数生成器:QRandomGenerator
    一、描述QRandomGenerator可用于从高质量随机数生成器生成随机值。与C++随机引擎一样,QRandomGenerator可以通过构造函数使用用户提供的值作为种子。播种时,此类生成的数字序列是确定性的。也就是说,给定相同的种子数据,QRandomGenerator会生成相同的数字序列。给定不同的种......
  • Qt 生成随机数 qrand、QRandomGenerator
    //老方法//利用qrand和qsrand生成随机数//位于QtGlobal中//例,生成一个0和10之间的随机数1qsrand(QTime::currentTime().msec());//设置种子,该种子作为qrand生成随机数的起始值,RAND_MAX为32767,即随机数在种子值到32767之间2qrand()%10;//新方法//利用QRandomGenerator类......
  • 【17.0】JavaScript之DOM
    【一】什么是DOM/BOM文档对象模型(DocumentObjectModel,简称DOM)浏览器对象模型(BrowserObjectModel,简称BOM)是JavaScript与网页内容及浏览器环境进行交互的两种核心概念。【1】DOM(1)概述文档对象模型(DOM)是一个编程接口,它以树状结构来表示HTML或XML文档。在D......
  • jQuery对象与DOM对象之间的转换方法
    jQuery对象与DOM对象之间的转换方法刚开始学习jquery,可能一时会分不清楚哪些是jQuery对象,哪些是DOM对象。至于DOM对象不多解释,我们接触的太多了,下面重点介绍一下jQuery,以及两者相互间的转换。什么是jQuery对象?就是通过jQuery包装DOM对象后产生的对象。jQuery对象是jQuery独有的......
  • 【Spring】spring事件监听异步处理
    在Spring框架中,ApplicationEventMulticaster接口是用于发布事件的核心组件。要支持异步处理事件,可以通过配置一个能够执行异步任务的TaskExecutor与SimpleApplicationEventMulticaster配合使用。以下是一个配置示例:importorg.springframework.context.annotation.Bean;importo......
  • 【spring】spring事件监听机制
    Spring框架的事件监听机制是基于观察者模式设计的,它允许应用程序的不同组件之间通过发布和订阅事件进行松散耦合的通信。以下是对Spring事件监听机制的基本流程和技术要点:ApplicationEvent:Spring中的所有事件都必须继承自org.springframework.context.ApplicationEvent类,这个......
  • C#手写http监听
    在应用程序中有时需要一个http接口来与第三方通讯。下面是个简单的代码示例:1publicasyncvoidStartHttpListener(stringurl)2{3HttpListenerhttpListener=newHttpListener();4httpListener.Prefixes.Add(url);5httpListener.Start();6whi......
  • pytest简易教程(30):pytest常用插件 - 随机执行(pytest-random-order)
     pytest简易教程汇总,详见:https://www.cnblogs.com/uncleyong/p/17982846应用场景用来验证用例在随机(无序)执行时是否正常 插件安装pipinstallpytest-random-order 使用方式加参数:--random-order 示例#!/usr/bin/envpython#-*-coding:utf-8-*-#@Author......