监听dom变化

最近项目中需要对于adsense的固定广告是否正常展示,做一个简单的事件打点,来确认广告投放效果。由于固定广告没有回调事件,但是谷歌固定广告对于展示成功的广告,都会主动去更改ins元素上的data-ad-status属性值。因此针对这个特点,我们可以手动实现成功展示和失败展示的事件打点, 以及后期可以针对这个打点,做一些特殊处理。

1、MutationObserver

Mutation Observer API 用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动,这个 API 都可以得到通知

注意:Mutation Observer 是异步触发,DOM 的变动并不会马上触发,而是要等到当前所有 DOM 操作都结束才触发。避免DOM 变动频繁,导致事件重复执行

使用方式:

  • 1、新建观察者实列
javascript 复制代码
var observer = new MutationObserver(function (mutations, observer) {
  mutations.forEach(function(mutation) {
    console.log(mutation);
  });
});

每次DOM变动后,回调函数就会触发。mutations是变动数组,observer是观察器实例

  • 2、使用observe,启动监听
ini 复制代码
const insEle = document.querySelector(".adsbygoogle");

var  options = {
  'attributes':true
} ;

observer.observe(insEle, options);

第一个参数:所要观察的 DOM 节点

第二个参数:一个配置对象,指定所要观察的特定变动

  • 3、options设置
    • childList:布尔值,子节点的变动(指新增,删除或者更改)。
    • attributes:布尔值,属性的变动。
    • characterData:布尔值,节点内容或节点文本的变动。
    • subtree:布尔值,表示是否将该观察器应用于该节点的所有后代节点。
    • attributeOldValue:布尔值,表示观察attributes变动时,是否需要记录变动前的属性值。
    • characterDataOldValue:布尔值,表示观察characterData变动时,是否需要记录变动前的值。
    • attributeFilter:数组,表示需要观察的特定属性(比如['class','src'])。

注意:childListattributescharacterData 中,必须有一个参数为 true。否则会抛出 TypeError 异常

  • 4、取消监听
ini 复制代码
observer.disconnect();

调用该方法后,DOM 再发生变动,也不会触发观察器

2、案列

js 复制代码
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-xxxxxxxx"
    crossorigin="anonymous"></script>
<ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-xxxxxxxx" data-ad-format="auto"
    data-full-width-responsive="true"></ins>
<script>
    (adsbygoogle = window.adsbygoogle || []).push({});
    const observerAds = () => {
        try {
            const insEle = document.querySelector(".adsbygoogle");
            if (insEle) {
                const observer = new MutationObserver((mutationsList, observer) => {
                    for (let mutation of mutationsList) {
                        if (mutation.type === 'attributes') {
                            if (mutation.attributeName === 'data-ad-status') {
                                console.log(insEle.getAttribute("data-ad-status"));
                                //logEvent(`ad_load_${insEle.getAttribute("data-ad-status")}`);
                                observer.disconnect();
                            }
                        }
                    }
                });
                const config = { attributes: true, attributeOldValue: true };
                observer.observe(insEle, config);
            }
        } catch (error) {
            console.log(error)
        }
    }
    observerAds();
</script>

3、相似api

MutationObserverIntersectionObserver是两个在web开发中常用的观察者对象,都是用于监测特定DOM元素的变化。

差异性:

  • MutationObserver用于监测DOM树的变化。它可以观察指定DOM节点及其子节点的变化,包括节点的添加、删除、属性的变化
  • IntersectionObserver用于监测DOM元素与其父容器或视口的交叉状态。它可以观察指定DOM元素与其父容器或视口的交叉情况,包括元素进入视口、离开视口、部分可见等 之前介绍过IntersectionObserver,可参考之前文章

4、参考:

相关推荐
咖啡星人k11 分钟前
从需求到交付:我用MonkeyCode的AI Agent完成了一个React数据看板
前端·人工智能·react.js·monkeycode
sxlishaobin13 分钟前
linux 自动清除日志 脚本
linux·服务器·前端
ZC跨境爬虫23 分钟前
跟着 MDN 学CSS day_37:(从文档流到粘性定位的底层原理)
前端·javascript·css·ui·html
IccBoY40 分钟前
NVM超详细全解教程:解决Node版本冲突(Win/Mac/Linux安装+使用+踩坑合集)
前端·node.js
wuhen_n42 分钟前
前端工程师进阶提示词工程实战
前端·langchain·ai编程
GISer_Jing1 小时前
Claude Code MCP Server 集成全解析
前端·人工智能·ai·架构
蚰蜒螟1 小时前
走进 Linux 内核:从 touch 命令到磁盘 inode 的完整旅程
java·linux·前端
因_崔斯汀1 小时前
用 AI 编程助手从零生成 3D 智慧校园数据大屏 —— Claude Code 实战全记录
前端
前端Hardy1 小时前
CSS 动画真的比 JS 快?Josh Comeau 做了组实验,结果跟直觉不一样
前端·javascript·后端
自进化Agent智能体1 小时前
MCP与Hooks:让AI Agent安全连接一切的治理框架
前端