浏览器窗口中几种常用的Observer

在JavaScript中有一群神秘的观察者,默默地监视着网页的一举一动,本次我们一起深入了解这些观察者,并学习如何利用它们来提升我们的网页互动性。

MutationObserver

侦听页面DOM结构变化

js 复制代码
// 创建一个MutationObserver实例来监视DOM变化
const bodyObserver = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    console.log(`DOM结构发生变化:${mutation.type}`);
  });
});

// 开始监视文档的body结构变化
bodyObserver.observe(document.body, { attributes: true, childList: true, subtree: true });

// 不再侦听时
bodyObserver.disconnect();

IntersectionObserver

主要用于侦听元素进入可视区

js 复制代码
// 创建一个IntersectionObserver实例
const lazyDetective = new IntersectionObserver((entries) => {

  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      console.log('目标进入视线,行动!');

      // 假设我们要懒加载图片
      entry.target.src = entry.target.dataset.src;
      lazyDetective.unobserve(entry.target); // 任务完成,停止观察
    }
  });

});

// 监视页面中的所有懒加载图片
document.querySelectorAll('img[data-src]').forEach((img) => {
  lazyDetective.observe(img);
});

ResizeObserver

侦听页面缩放

js 复制代码
// 创建一个ResizeObserver实例来监视元素的大小变化
const sizeSpy = new ResizeObserver((entries) => {
  entries.forEach((entry) => {
    console.log(`侦测到尺寸变化:${entry.target.id} 现在的尺寸是 ${entry.contentRect.width}px x ${entry.contentRect.height}px`);
  });
});

// 开始监视一个特定元素的大小
sizeSpy.observe(document.querySelector('#myElement'));

PerformanceObserver

侦听页面性能

认识一下performance对象

  • performance对象是window对象的一个属性。
  • 它允许你获取到当前页面的性能相关数据,如页面加载时间、解析DOM所需的时间等。
  • 此外,它还提供了一系列方法,如performance.mark()和performance.measure(),这些方法可以用来创建自定义的性能标记和测量,帮助开发者监控和分析代码执行性能。
  • 简而言之,performance是一个强大的工具,它使得性能监控和分析变得更加直接和便捷。

步骤 1: 添加性能标记

首先,我们在代码的关键点添加性能标记。这些标记可以帮助我们测量代码执行的关键部分所需的时间。

js 复制代码
// 标记开始加载图片

performance.mark('startLoadImage');

// 假设这里有一个函数用于加载图片,加载完成后会调用回调函数

loadImage('example.jpg', () => {

  // 图片加载完成,标记结束时间

  performance.mark('endLoadImage');

  // 添加一个性能测量,计算加载图片所需的时间

  performance.measure('loadImageDuration', 'startLoadImage', 'endLoadImage');

});

步骤 2: 使用PerformanceObserver来监控性能条目

接下来,我们使用PerformanceObserver来监控这些性能条目,并获取我们刚才添加的标记和测量的数据。

js 复制代码
// 创建一个PerformanceObserver实例来监听mark和measure事件

const observer = new PerformanceObserver((list) => {

  const entries = list.getEntries();

  entries.forEach((entry) => {

    console.log(`名称:${entry.name},类型:${entry.entryType},持续时间:${entry.duration}`);

  });

});

// 开始观察mark和measure类型的性能条目

observer.observe({entryTypes: ['mark', 'measure']});

示例解释

  • 在这个例子中,我们首先使用performance.mark方法在图片开始加载和加载完成时分别添加了两个性能标记(startLoadImage和endLoadImage)。
  • 然后,我们使用performance.measure方法添加了一个性能测量(loadImageDuration),它计算了从startLoadImage到endLoadImage的时间差,即加载图片所需的时间。
  • 接着,我们创建了一个PerformanceObserver实例,并通过其observe方法指定我们只关注mark和measure类型的性能条目。
  • 当这些类型的性能事件发生时,PerformanceObserver会自动收集这些事件的数据,并通过回调函数提供给我们。
  • 在回调函数中,我们遍历所有收集到的性能条目,并打印出它们的名称、类型和持续时间。
  • 通过这种方式,我们可以非常方便地监控和分析网页或应用中特定操作的性能,进而找到性能瓶颈并进行优化。
相关推荐
莹雨潇潇5 分钟前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
Jiaberrr14 分钟前
Element UI教程:如何将Radio单选框的圆框改为方框
前端·javascript·vue.js·ui·elementui
Tiffany_Ho1 小时前
【TypeScript】知识点梳理(三)
前端·typescript
安冬的码畜日常2 小时前
【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)
开发语言·前端·javascript·信息可视化·数据可视化·d3.js
太阳花ˉ2 小时前
html+css+js实现step进度条效果
javascript·css·html
小白学习日记3 小时前
【复习】HTML常用标签<table>
前端·html
john_hjy3 小时前
11. 异步编程
运维·服务器·javascript
风清扬_jd3 小时前
Chromium 中JavaScript Fetch API接口c++代码实现(二)
javascript·c++·chrome
丁总学Java3 小时前
微信小程序-npm支持-如何使用npm包
前端·微信小程序·npm·node.js