MutationObserver监听dom元素结构及属性变化
工作中埋码需求,当某些动态插入的元素出现时触发埋码事件,因此需要对插入元素的父节点进行监听,子节点发生变化时触发相应埋码逻辑。
方法一 监听页面结构及子元素变化:
(function () {
//事件触发时执行埋码内容
function do_track() {
if ($("#LXB_CONTAINER > ins.lxb-cb-tip.lxb-cb-tip-feedback > ins.lxb-cb-tip-con > ins.success-tip-phone") && eventflag) {
//触发事件
eventflag = false;
if (timer) { clearInterval(timer) }
}
}
try {
var eventflag = true;
var message_box = document.querySelector("#va");
//以下代码为监控整个Body元素的变化
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
if (MutationObserver) {
var MutationObserverConfig = {
childList: true,
subtree: true,
};
var observer = new MutationObserver(function (mutations) {
do_track();
});
observer.observe(message_box, MutationObserverConfig);
}
else if (message_box.addEventListener) {
message_box.addEventListener("DOMSubtreeModified", function (evt) {
do_track();
}, false);
}else {
var timer = setInterval(function () {
do_track();
}, 1000)
}
} catch (error) {
}
})()
方法二 监听元素属性值的变化触发相应逻辑:
try{
//Watch Elements and Trigger Event
var observer = new MutationObserver(function(mutations){
console.log(mutations)
var isShowOnetimeCheck = [];
//get lastone in mutations
var mutaiton = mutations[mutations.length-1];
//event name & content Dict list
var eventNameDict = {"pattern01":{"show":"sssss","click":"dddddd"},"pattern02":{"show":"eeeee","click":"ffff"},"pattern03":{"show":"gggg","click":"qqqq"}};
var patternName = mutaiton.target.className.split(" ")[0];
var eventNameObj = eventNameDict[patternName];
console.log("patternName:"+mutaiton.target.className.split(" ")[0])
var buttonImg = mutaiton.target.querySelector("div.check_contents.active > div > a > img");
if(buttonImg && eventNameObj && mutaiton.target.className.includes("active") && !isShowOnetimeCheck.includes(mutaiton.target.className)){
setTimeout(function(){
//触发事件
},2500)
$(document.querySelector("div.check_contents.active > div > a > img").parentElement).off("click").on("click",function(){
//触发事件
isShowOnetimeCheck.push(mutaiton.target.className);
})
}
//mutations.querySelector("div.check_contents.active > div > a > img").getAttribute("alt")
});
/** 所监听变化元素的父节点*/
var elem = document.querySelector('#template > div.check_container > div.check_after');
/** 监听设置
*childList:子节点的变动(指新增,删除或者更改)。
*attributes:属性的变动。
*characterData:节点内容或节点文本的变动。
*subtree:布尔值,表示是否将该观察器应用于该节点的所有后代节点。
*attributeOldValue:布尔值,表示观察attributes变动时,是否需要记录变动前的属性值。
*characterDataOldValue:布尔值,表示观察characterData变动时,是否需要记录变动前的值。
*attributeFilter:数组,表示需要观察的特定属性(比如['class','src'])
*/
var config = {
attributes: true,
attributeFilter : ['class'],
childList: true,
subtree:true,
characterData: true,
characterDataOldValue: true,
};
/** 元素与监听设置绑定 */
observer.observe(elem, config);
}catch(e){
console.log("ptmessage:"+e);
}
MutationObserver监听dom元素结构及属性变化的更多相关文章
- MutationObserver 监听DOM树变化
1 概述 Mutation observer 是用于代替 Mutation events 作为观察DOM树结构发生变化时,做出相应处理的API.为什么要使用mutation observer 去代替 ...
- MutationObserver 监听 DOM 树变化
MutationObserver 是用于代替 MutationEvents 作为观察 DOM 树结构发生变化时,做出相应处理的 API .为什么要使用 MutationObserver 去代替 Mut ...
- js监听dom元素内容变化
$("#divid").bind('DOMNodeInserted', function(e) { alert('element now contains: ' + $(e.tar ...
- jQuery学习(监听DOM加载)
jQuery的extend方法 function njQuery() { } /* njQuery.extend = function (obj) { // 此时此刻的this就是njQuery这个类 ...
- js动态监听dom变化
原生js 动态监听dom变化,根据不同的类型绑定不同的处理逻辑 // Firefox和Chrome早期版本中带有前缀 var MutationObserver = window.MutationO ...
- js实时监听dom尺寸变化
开发过程中总会遇到dom节点尺寸变化,去做一些相应的逻辑,第一想到的应该是用$(window).resize()去做,但是这个是监听浏览器窗口的所以这个时候要用 ResizeObserver Resi ...
- JS监听DOM结构变化
在做一个微博的接入,需要判断微博是否被关注,要检查微博标签的DIV是否有“已关注”的字符,但这个DIV的内容是微博JSSDK动态生成.$("#id").html()是获取不到我想要 ...
- javascript 原生方法监听DOM结构改变事件
js原生方法监听DOM结构改变事件 document.addEventListener('DOMNodeInserted',function(){alert(1)},false);document.a ...
- vue中监听页面滚动和监听某元素滚动
①监听页面滚动 在生命周期mounted中进行监听滚动: mounted () { window.addEventListener('scroll', this.scrollToTop) }, 在方法 ...
- js监听某个元素高度变化来改变父级iframe的高度
最近需要做一个iframe调用其他页面内容,这个iframe地址是可变化的,但是里面的内容高度不确定且里面内容高度可调整,所以需要通过监听iframe里面body的高度变化来调整iframe的高度. ...
随机推荐
- STL-stack(ACM)
1.没有.clear()操作,需要手动pop() 重构函数(默认) stack<int> a; 基础操作 a.push() // 入栈 a.pop() // 弹出栈顶元素 a.empty( ...
- 在Istio中,到底怎么获取 Envoy 访问日志?
Envoy 访问日志记录了通过 Envoy 进行请求 / 响应交互的相关记录,可以方便地了解具体通信过程和调试定位问题. 环境准备 部署 httpbin 服务: kubectl apply -f sa ...
- HTTP请求:requests的进阶使用方法浅析
1 背景 上篇文章讲解了requests模块的基础使用,其中有get.put.post等多种请求方式,使用data.json等格式做为请求参数,在请求体中添加请求头部信息的常见信息,如:headers ...
- FPGA加速技术在人机交互界面中的应用及优化
目录 引言 随着人工智能.云计算.大数据等技术的发展,人机交互界面的重要性也越来越凸显.作为用户与计算机之间的桥梁,人机交互界面的性能和效率直接影响用户的体验和使用效果.为了优化人机交互界面的性能,我 ...
- springboot中自定义JavaBean返回的json对象属性名称大写变小写问题
目录 一.继承类 二.手动添加Get方法 三.@JsonProperty 四.spring-boot json(jackson)属性命名策略 开发过程中发现查询返回的数据出现自定义的JavaBean的 ...
- Java 数组及数组的优点与缺点
1.java中的数组是一种引用数据类型.不属于基本数据类型.数组的父类是Object. 2.数组实际上是一个容器,可以同时容纳多个元素.(数组相当于是一个数据的集合.) 数组的字面意思是"一 ...
- ASL单芯片CS5366TypeC转HDMI4K60HZ加HUB多口方案|CS5366带PD拓展方案原理图
CS5366芯片是ASL集睿致远最新推出的2Len带PD的扩展坞方案芯片,CS5366支持4K60HZ. 在分辨率4K下,刷新率60HZ对于30HZ看似提升不多,但是对于应用在游戏主座的客户来说至关重 ...
- idea专业版和idea社区版整合Tomcat,并将war包部署
目录 一.idea专业版部署 二.idea社区版部署 三.错误案例 开发过程中,由于需要运用云平台,所以从新配置开发环境,其它或多或少有些许问题,但解决起来较为轻松.而对于部署注册中心Eureka时, ...
- HTB靶场之OnlyForYou
准备: 攻击机:虚拟机kali. 靶机:OnlyForYou,htb网站:https://www.hackthebox.com/,靶机地址:https://app.hackthebox.com/mac ...
- ubuntu 20.04 网络配置
参考链接:ubuntu 20.04 网络配置 网络配置文件目录:/etc/netplan/ 配置实例 # 静态 network: version: 2 ethernets: ens33: addres ...