工作中埋码需求,当某些动态插入的元素出现时触发埋码事件,因此需要对插入元素的父节点进行监听,子节点发生变化时触发相应埋码逻辑。

  方法一 监听页面结构及子元素变化:

(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元素结构及属性变化的更多相关文章

  1. MutationObserver 监听DOM树变化

    1 概述 Mutation observer 是用于代替 Mutation events 作为观察DOM树结构发生变化时,做出相应处理的API.为什么要使用mutation observer 去代替 ...

  2. MutationObserver 监听 DOM 树变化

    MutationObserver 是用于代替 MutationEvents 作为观察 DOM 树结构发生变化时,做出相应处理的 API .为什么要使用 MutationObserver 去代替 Mut ...

  3. js监听dom元素内容变化

    $("#divid").bind('DOMNodeInserted', function(e) { alert('element now contains: ' + $(e.tar ...

  4. jQuery学习(监听DOM加载)

    jQuery的extend方法 function njQuery() { } /* njQuery.extend = function (obj) { // 此时此刻的this就是njQuery这个类 ...

  5. js动态监听dom变化

    原生js 动态监听dom变化,根据不同的类型绑定不同的处理逻辑 // Firefox和Chrome早期版本中带有前缀   var MutationObserver = window.MutationO ...

  6. js实时监听dom尺寸变化

    开发过程中总会遇到dom节点尺寸变化,去做一些相应的逻辑,第一想到的应该是用$(window).resize()去做,但是这个是监听浏览器窗口的所以这个时候要用 ResizeObserver Resi ...

  7. JS监听DOM结构变化

    在做一个微博的接入,需要判断微博是否被关注,要检查微博标签的DIV是否有“已关注”的字符,但这个DIV的内容是微博JSSDK动态生成.$("#id").html()是获取不到我想要 ...

  8. javascript 原生方法监听DOM结构改变事件

    js原生方法监听DOM结构改变事件 document.addEventListener('DOMNodeInserted',function(){alert(1)},false);document.a ...

  9. vue中监听页面滚动和监听某元素滚动

    ①监听页面滚动 在生命周期mounted中进行监听滚动: mounted () { window.addEventListener('scroll', this.scrollToTop) }, 在方法 ...

  10. js监听某个元素高度变化来改变父级iframe的高度

    最近需要做一个iframe调用其他页面内容,这个iframe地址是可变化的,但是里面的内容高度不确定且里面内容高度可调整,所以需要通过监听iframe里面body的高度变化来调整iframe的高度. ...

随机推荐

  1. MassTransit实现Saga模式概览

    原文地址:Saga Overview 编排一系列事件的能力是一个强大的功能,而MassTransit使这成为可能. saga是由协调器管理的长期事务.saga是由事件发起的,saga编排事件,saga ...

  2. 聊聊CSS 缓动函数的新成员linear()

    CSS 缓动函数是一种用于控制 CSS 动画过渡效果的函数,可以让动画变得更加自然.这篇文章将介绍一种新的 CSS easing function,即 linear(),它可以模拟出更复杂的缓动效果, ...

  3. Java关键字break、continue 、return的区别,嵌套循环,数组的概念以及数组案例

    一.关键字 break.continue .return的区别 1.break : 用于在switch..case中放置语句块穿透, ​ 用于跳出循环 // 从1-100 遇到7的倍数 break f ...

  4. Swift4 入门到精通(第二章基本数据类型与量值)

    第二章 量值和基本数据类型 Swift 支持的基本数据类型, 整型,浮点型,布尔型,元组,可选类型. 学习的目标: 常量与变量的意义.声明.命名规范.类型 数据进制与计算机存储原理 整型数据.浮点型数 ...

  5. MySQL8新特性窗口函数详解

    本文博主给大家详细讲解一波 MySQL8 的新特性:窗口函数,相信大伙看完一定能有所收获. 本文提供的 sql 示例都是基于 MySQL8,由博主亲自执行确保可用 博主github地址:http:// ...

  6. 【HMS Core】华为帐号服务,获取Access Token报错{sub_error:20152,error_description:invalid code,error:1101}

    ​ [问题描述] 华为账号服务,接口获取Access Token报错:{sub_error:20152,error_description:invalid code,error:1101} [问题分析 ...

  7. Android Studio中SQLite的使用,主要介绍sqlite插入和读出图片(ViewBinder)的操作方法

    sqlite简介 本人最近在写一个小的安卓项目,开发app过程中用到了安卓自带的sqlite.本文主要对sqlite图片操作进行介绍,其他存入文本之类的操作和普通数据库一样,众所周知,sqlite是一 ...

  8. 如何在long-running task中调用async方法

    什么是 long-running thread long-running task 是指那些长时间运行的任务,比如在一个 while True 中执行耗时较长的同步处理. 下面的例子中,我们不断从队列 ...

  9. 龙芯电脑编译redis (loongarch)

    1.获取源码 源码地址:https://redis.io/download/#redis-downloads 最新版本是7.2,这里用redis5测试,最后一个版本是5.0.14 wget https ...

  10. UE5打包SDK未正确安装的问题

    正文 Windows(笔者之前用的电脑是windows10,最新电脑使用的是windows11)下UE5打包项目的需要安装Visual Studio. 而且安装的时候需要选择上C++ 游戏开发相关模块 ...