浏览器 - 5 种 Observer

本文介绍了浏览器中的五种Observer:MutationObserver、IntersectionObserver、PerformanceObserver、ResizeObserver和ReportingObserver,用于监听DOM变化、元素可见性、性能指标、尺寸变化和报告事件。特别地,MutationObserver详细讲解了其观察目标、选项及不同类型的变更事件。
摘要由CSDN通过智能技术生成

浏览器提供了 5 种 Observer 来监听这些变动:
MutationObserver、IntersectionObserver、PerformanceObserver、ResizeObserver、ReportingObserver

浏览器渲染过程中, 会对这些监听事件调用

callback一般会触发两次。一次是目标元素刚刚进入视口(开始可见),另一次是完全离开视口(开始不可见)

function intersection(entries) {
    entries.forEach((entry) => {
        if (entry.isIntersecting) {
            var targetNode = entry.target;
            // do sth
        }
        
    })
}
var intersectionObserver = new IntersectionObserver(intersectionCallback, options);
intersectionObserver.observe(targetNode);

var mutationObserver = new MutationObserver(mutationCallback, options);
mutationObserver.observe(targetNode);

let Options = {
  childList: bool,
  attributes: bool,
  characterData: bool,
  subtree: bool,
  attributeFilter: array,
  attributeOldValue: bool,
  characterDataOldValue: bool,
}
const mutationObserver = new MutationObserver((mutations) => {
    console.log('trigged')
    for (let mutation of mutations) {
        switch (mutation.type) {
            case 'childList': break;
            case 'attributes': break;
        }
    }
});
observer.observe(targetNode, Options);

function callback (mutationList, observer) {
    mutationList.forEach((mutation) => {
      switch (mutation.type) {
        case 'childList':
          /* 从树上添加或移除一个或更多的子节点;参见 mutation.addedNodes 与
             mutation.removedNodes */
            console.log(mutation)
          break
        case 'attributes':
          /* mutation.target 中某节点的一个属性值被更改;该属性名称在 mutation.attributeName 中,
             该属性之前的值为 mutation.oldValue */
             console.log('attributes')
          break
      }
    })
}

let targetNode = document.querySelector('#sidebar_shortcut') // 获取监听 DOM 对象
let observerOptions = {
    childList: true, // 观察该元素的子元素新增或者删除    
    attributes: true, // 观察属性变动     
    subtree: true, //该元素的所有子元素新增或者删除    
    characterData: true, // 监听text或者comment变化    
    attributeOldValue: true, //属性原始值    
    characterDataOldValue: true   
}
let observer = new MutationObserver(callback)
observer.observe(targetNode, observerOptions)

// 操作
let dom = document.createElement('li')
dom.innerHTML = '测试';
setTimeout(() => {
    targetNode.appendChild(dom) // 触发 childList
}, 1000)
setTimeout(() => {
    targetNode.style.color = 'red' // 触发 attributes
}, 2000)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值