Observer

news2024/11/17 21:54:45


一些比较方便的 DOM 监测的 API。

一个 Observer 实例具备的实例方法:

  • observe。向监听的目标集合添加一个元素。
  • unobserve。停止对一个元素的观察。
  • disconnect。终止对所有目标元素的观察。

一、IntersectionObserver

提供了一种异步检测目标元素与祖先元素或视口相交情况变化的方法。

示例,检测目标元素与浏览器视窗是否完全相交:

// 定义一个Observer
let options = {
  root: null, // document.querySelector("#parent")
  rootMargin: "0px",
  threshold: 1.0, // [0, 0.25, 0.5, 0.75, 1]
};
let observer = new IntersectionObserver(callback, options);

// 使用用Observer监测目标元素
let target = document.querySelector("#target");
observer.observe(target);

ResizeObserver Constructor

new ResizeObserver(callback),构造器接收两个参数:

callback。回掉函数,当检测到相交时触发

options。配置相交规则

  • root。指定与目标元素进行比对的父元素
    • 当值为 null,则认为是浏览器视窗。
    • 值为 HTMLElement
  • rootMargin。外边距。
  • threshold。指定callback触发的时机
    • 值为数组,如 0.5,即可见程度为 50% 时触发一次回调。
    • 值为数组时,如[0, 0.25, 0.5, 0.75, 1],即可见程度每多 25% 就触发一次回调。

使用场景

  • 图片懒加载——当图片滚动到可见时才进行加载
  • 内容无限滚动——也就是用户滚动到接近内容底部时直接加载更多,而无需用户操作翻页,给用户一种网页可以无限滚动的错觉
  • 检测广告的曝光情况——为了计算广告收益,需要知道广告元素的曝光情况
  • 在用户看见某个区域时执行任务或播放动画

二、ResizeObserver

Resize Observer API 提供了一种高性能的机制,通过该机制,代码可以监视元素的大小更改,并且每次大小更改时都会向观察者传递通知。

示例,监控两个元素的大小变化:

<div id="box">
  <div id="inner"></div>
</div>
const box = document.querySelector("#box");
const inner = document.querySelector("#inner");

const observer = new ResizeObserver((entries, observer) => {
  console.log(entries);
  console.log(observer);
});
observer.observe(box);
observer.observe(inner);

ResizeObserver Constructor

new ResizeObserver(callback),构造器接收的 callback 接收两个参数:

  • entries。一个ResizeObserverEntry对象数组,可以用于获取每个元素改变后的新尺寸。
  • observer。观察者对象自身

使用场景

  • 媒体适配优化
  • 自适应布局
  • 窗口变化监测
  • REM 重置

三、PerformanceObserver

用于监测性能度量事件,在浏览器的性能时间轴记录新的 performance entry 的时候将会被通知。

示例:

function perf_observer(list, observer) {
  // Process the "measure" event
  // 处理 "measure" 事件
}
var observer = new PerformanceObserver(perf_observer);
observer.observe({ entryTypes: ["measure"] });

PerformanceObserver Constructor

new PerformanceObserver(callback),构造器接收的 callback 接收两个参数:

  • list。性能观察条目列表
  • obj。观察者对象自身

支持的性能观察列表

使用代码PerformanceObserver.supportedEntryTypes检测浏览器支持的类型。

// chrome中执行Code,查看输出结果

PerformanceObserver.supportedEntryTypes;
// ['back-forward-cache-restoration', 'element', 'event', 'first-input', 'largest-contentful-paint', 'layout-shift', 'longtask', 'mark', 'measure', 'navigation', 'paint', 'resource', 'visibility-state']

使用场景

LCP(Largest Contentful Paint),最大内容绘制

const observer = new PerformanceObserver((list) => {
  let perfEntries = list.getEntries();
  console.log(perfEntries);
});
observer.observe({
  entryTypes: ["largest-contentful-paint", "longtask"],
});

四、MutationObserver

MutationObserver 接口提供了监视对 DOM 树所做更改的能力。它被设计为旧的 Mutation Events 功能的替代品,该功能是 DOM3 Events 规范的一部分。

示例,检测目标元素的属性、子节点、所有后代节点的变化:

const observer = new MutationObserver(function (mutationsList, observer) {
  for (let mutation of mutationsList) {
    console.log(mutation.type, "changed");
  }
});

const targetNode = document.getElementById("box");
observer.observe(targetNode, {
  attributes: true,
  childList: true,
  subtree: true,
});

MutationObserver Constructor

new MutationObserver(callback),构造器接收的 callback 接收两个参数:

  • mutationsList。所有被触发改动的 MutationRecord 对象数组
  • observer。观察者对象自身

支持观测类型:

  • subtree。当为 true 时,将会监听以 target 为根节点的整个子树。包括子树中所有节点的属性,而不仅仅是针对 target。
  • childList。当为 true 时,监听 target 节点中发生的节点的新增与删除(同时,如果 subtree 为 true,会针对整个子树生效)。
  • attributes。当为 true 时观察所有监听的节点属性值的变化。
  • attributeFilter。一个用于声明哪些属性名会被监听的数组。如果不声明该属性,所有属性的变化都将触发通知。
  • attributeOldValue。当为 true 时,记录上一次被监听的节点的属性变化;
  • characterData。当为 true 时,监听声明的 target 节点上所有字符的变化。
  • characterDataOldValue。当为 true 时,记录前一个被监听的节点中发生的文本变化。

五、ReportingObserver

处于实验阶段的 API。用于收集、访问报告。

链接

  • [^1] IntersectionObserver
  • [^2] IntersectionObserver Constructor
  • [^3] ResizeObserver
  • [^4] ResizeObserver Constructor
  • [^5] PerformanceObserver
  • [^6] PerformanceEntry.entryType
  • [^7] MutationObserver
  • [^9] ReportingObserver
  • [^10] ReportingObserverOptions

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图解LeetCode——792. 匹配子序列的单词数(难度:中等)

一、题目 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串&#xff0c;可以从中删去一些字符(可以是none)&#xff0c;而不改变其余字符的相对顺序。 例如&#xff0c; “ace” 是 “abcde” 的…

css3对页面打印设置的一些特殊属性,如@page,target-counter等

公司内部应业务需求&#xff0c;需要将html生成pdf并能打印&#xff0c;前后台都各有方式&#xff0c;这里综合比较选择用java去生成&#xff0c;避免了前端生成带来的诸多问题&#xff0c;后台用的框架是 iTextPdf 但是在做的同时发现用iText实现的pdf生成和公司的业务需要生成…

Spring学习第6篇: 基于注解使用IOC

大家家好&#xff0c;我是一名网络怪咖&#xff0c;北漂五年。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深Java选手&#xff0c;深知Spring重要性&#xff0c;现在普遍都使用SpringBoot来开发&#xff0c;面试的时候SpringBoot原理也是经常会问到&…

【数据链路层】封装成帧和透明传输和差错控制

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录前言链路层功能功能封装成帧和透明传输组帧的四种方法透明传输差错控制检错编码差错链路层的差错控制检错编码纠错编码链路层代码实现&#x1f343;博主昵称&#xff1a;一拳必胜客 &#x1f338;博主寄语&a…

27.gateway的限流实战(springcloud)

1 什么是限流 通俗的说&#xff0c;限流就是限制一段时间内&#xff0c;用户访问资源的次数&#xff0c;减轻服务器压力&#xff0c;限流大致分为两种&#xff1a; 1. IP 限流&#xff08;5s 内同一个 ip 访问超过 3 次&#xff0c;则限制不让访问&#xff0c;过一段时间才可继…

E-Prime心理学实验设计软件丨产品简介

拖放设计 通过将对象拖放到时间轴上来构建文本、图像、声音和视频的实验。利用我们的实验库中的免费模板和预建实验。 计时精度 E-Prime 3.0 将计时精度报告到毫秒精度级别。请务必使用我们的测试工具来确认您的计算机硬件能够进行关键计时。将Chronos添加到您的研究设置中&a…

Kubernetes 系统化学习之 资源清单篇(三)

Kubernetes 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。 根据不同的级别&#xff0c;可以将 Kubernetes 中的资源进行多种分类。以下列举的内容都是 K…

轻松学习jQuery控制DOM

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;前端开发者…

ESP8266--Arduino开发(驱动WS2812B)

文章目录一、WS2812彩灯介绍二、安装Adafruit_NeoPixel驱动库三、Adafruit_NeoPixel库常用接口四、使用示例五、网页端控制WS2812B灯带实例一、WS2812彩灯介绍 WS2812是一个集控制电路与发光电路于一体的智能外控LED光源&#xff0c;外型与5050LED灯珠相同&#xff0c;每个灯珠…

Linux修改默认登录端口22

目录 一、编辑sshd配置 二、重启sshd 三、防火墙开放端口 四、重启防火墙 五、测试连接 六、防火墙关闭22端口 前言&#xff1a;ssh登录的默认端口是22&#xff0c;如果不修改默认端口的话&#xff0c;会不安全&#xff0c;默认端口会遭到攻击&#xff0c;为了安全要修…

JavaEE之HTTP协议 Ⅰ

文章目录前言一、协议格式总结二、认识URL三、认识"方法"(method)1.GETGET请求的特点2.POSTPOST 请求的特点总结前言 网络技术中,最核心的概念,就是"协议",HTTP就是应用层典型的协议 应用层,很多时候需要程序员自定义应用层协议,也有一些现成的协议,供我们…

代码随想录算法训练营第57天 | 647. 回文子串 516.最长回文子序列 dp总结

代码随想录系列文章目录 动态规划篇 —— 区间dp 文章目录代码随想录系列文章目录动态规划篇 —— 区间dp647. 回文子串516.最长回文子序列代码随想录中动态规划总结647. 回文子串 题目链接 回文子串还是很难的我觉得&#xff0c;所以应该多做几遍 这道题的dp数组代表就不是问…

Linux之用户操作【用户的增删改查你要的都有】【详细】

目录用户相关介绍添加用户useradd [选项] 用户名passwd 用户名细节说明删除用户userdel 用户名userdel -r 用户名查询用户id 用户名切换用户su 用户名默认输入su切换到管理员目录用户组groupadd 组名userdel 组名补充&#xff1a; useradd -g 用户组 用户名补充&#xff1a;use…

BigLEN(rat)脑内最丰富的多肽之一、LENSSPQAPARRLLPP

BigLEN(rat) TFA 是脑内最丰富的多肽之一&#xff0c;是有效的 GPR171 激动剂&#xff0c;其EC50 值为1.6 nM。 BigLEN(rat) TFA, one of the most abundant peptides in brain, is a potent GPR171 agonist, with an EC50 of 1.6 nM[1][2].编号: 200557 中文名称: BigLEN(rat)…

详解MySQL事务日志——undo log

前言 众所周知&#xff0c;事务的一大特点是原子性&#xff0c;即同一事务的SQL要同时成功或者失败。那大家有没有想过在MySQL的innoDB存储引擎中是如何保证这样的原子性操作的&#xff1f;实际上它是利用事务执行过程中生成的日志undo log来实现的&#xff0c;那么undo log究…

加速推进企业信息化建设,SRM采购系统赋能建筑工程产业生态链实现数字化转型

建筑工程行业是拉动国民经济发展的重要支柱产业之一。近年来建筑业占国民生产总值的20&#xff05;左右&#xff0c;对国民经济影响很大。随着我国建筑业企业生产和经营规模的不断扩大&#xff0c;建筑业总产值持续增长&#xff0c;传统的管理手段早已无法实现企业的精细化管理…

Fiddler/Charles - 夜神模拟器证书安装App抓包

Fiddler/Charles - 夜神模拟器证书安装App抓包 文章目录Fiddler/Charles - 夜神模拟器证书安装App抓包前言一、软件安装1.Openssl安装1.1下载安装1.2配置环境变量1.3查看openssl版本&#xff0c;输入命令&#xff1a;openssl version2.夜神模拟器安装1.1 下载安装1.2工具准备&a…

三、RTMP协议 视频Chunk和音频Chunk到底长啥样?

重要概念 RTMP Chunk Header RTMP Chunk Header的长度不是固定的&#xff0c;分为: 12 Bytes、8 Bytes、4 Bytes、1 Byte 四种&#xff0c;由RTMP Chunk Header前2位决定。 FLV VideoTagHeader 分析RTMP流时&#xff0c;经常看到与0x17或0x27进行比较的情况&#xff0c;那0x1…

Azide-PEG-acid,N3-PEG-COOH,叠氮-聚乙二醇-羧基多用于点击化学

Azide-PEG-acid&#xff08;N3-PEG-COOH&#xff09;&#xff0c;该化学试剂的中文名为叠氮-聚乙二醇-羧基&#xff0c;它所属分类为Azide PEG Carboxylic acid PEG。 该peg试剂的分子量均可定制&#xff0c;有&#xff1a;1000、2000、3400、20000、10000、5000 。该试剂质量…

k8s部署

kubernetes简要 Kubernetes 是用于自动部署, 扩展和管理容器化应用程序的开源系统. 它将组成应用程序的容器组合成逻辑单元, 以便于管理和服务发现 kubernetes 功能简介 服务发现和负载均衡 存储编排 自动部署和回滚 自动完成装箱计算 自我修复 密钥与配置管理 主机规…