首页 > 编程语言 >用于现代JavaScript的Observer API

用于现代JavaScript的Observer API

时间:2022-11-08 12:39:00浏览次数:42  
标签:const Observer observer JavaScript 观察者 API 突变 entry 观察

用于现代JavaScript的Observer API_响应式

英文 | https://dev.to/codyjasonbennett
作者 | Cody Bennett


Observer API(观察者API)释放了Web隐藏的超能力,以创建真正的响应式体验,从懒加载关键内容到非侵入式性能监控。

在检测变化方面非常方便,可以用来创建响应式应用。

有四种不同类型的观察者可以观察不同的东西——从DOM到浏览器性能。

MutationObserver

MutationObserver观察DOM树,监听DOM的变化。​

// 选择要观察突变的节点
const targetNode = document.getElementById('element');


// 观察者的选项(观察哪些突变)
const config = {
attributes: true,
childList: true,
subtree: true,
};


// 创建一个观察者实例,链接到一个回调,以便在观察到突变时执行。
const observer = new MutationObserver((mutations, observer) => {
mutations.forEach(mutation => {
if (mutation.type === 'childList') {
console.log('A child node has been added or removed.');
} else if (mutation.type === 'attributes') {
console.log(`The ${mutation.attributeName} attribute was modified.`);
}
});
});


// 开始观察目标节点的配置突变情况
observer.observe(targetNode, config);


// 之后,你可以停止观察
observer.disconnect();

当一个元素的属性、文本或内容发生变化时,我们会得到通知,同时也会监控子节点是否被添加或删除。

这对于调整DOM中元素的大小以及重置DOM值特别有用。

IntersectionObserver

IntersectionObserver观察一个DOM元素的可见性,监听其位置的变化。​

// 选择要观察突变的节点
const targetNode = document.getElementById('element');


// 观察者的选项(观察哪些突变)
const config = {
rootMargin: '-100% 0px 0px 0px',
};


// 创建一个观察者实例,链接到一个回调,以便在观察到突变时执行。
const intersectionObserver = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
console.log('Observing.');


// 之后,你可以停止观察
observer.unobserve(entry.target);
}
});
});


// 开始观察
intersectionObserver.observe(targetNode, config);

这在基于目标元素的可见性和位置的懒惰加载和动画内容方面非常有用。

ResizeObserver

ResizeObserver观察元素的内容或边框,监听元素及其子元素的变化。​

// 选择要观察突变的节点
const targetNode = document.getElementById('element');


const resizeObserver = new ResizeObserver((entries, observer) => {
entries.forEach(entry => {
console.log(`Element size: ${entry.width}px x ${entry.height}px`);
console.log(`Element padding: ${entry.top}px ; ${entry.left}px`);


// 之后,你可以停止观察
observer.unobserve(entry.target);
});
});


// 开始观察
resizeObserver.observe(targetNode);

创建基于输入或触发器包装的动态内容时,此观察者非常重要。

PerformanceObserver

PerformanceObserver观察性能测量事件,监听新的性能条目。​

// 观察者的选项(观察哪些突变)
const config = {
entryTypes: ['resource', 'mark', 'measure']
};


const observer = new PerformanceObserver(list => {
list.getEntries().forEach(entry => {
// 在控制台上显示每个报告的测量
console.log(
`Name: ${entry.name}`,
`Type: ${entry.entryType}`,
`Start: ${entry.startTime}`,
`Duration: ${entry.duration}`,
);
});
});


// 开始观察
observer.observe(config);
performance.mark('registered-observer');

这对于接收性能通知很有用,可以在空闲时间运行,而不与关键的渲染工作竞争。

本文完~


用于现代JavaScript的Observer API_可见性_02

用于现代JavaScript的Observer API_子节点_03

标签:const,Observer,observer,JavaScript,观察者,API,突变,entry,观察
From: https://blog.51cto.com/u_15809510/5832520

相关文章

  • 18行JavaScript代码构建一个倒数计时器
    英文|https://www.sitepoint.com   作者|NilsonJacques​有时候,你会需要构建一个JavaScript倒计时时钟。你可能会有一个活动、一个销售、一个促销或一个游戏。你可......
  • 14个 JavaScript 中鲜为人知的技巧
    英文| http://developer.51cto.com/art/201912/607686.htm人们通常认为JavaScript是一门很容易上手的语言,但是要做到精通却不简单。是的,这是因为JavaScript是一种非......
  • C# WebApi 权限过滤器
    protectedoverridevoidHandleUnauthorizedRequest(HttpActionContextfilterContext){base.HandleUnauthorizedRequest(filterContext)......
  • API Groups
    在kubernetes中,除了可以使用kubectl工具来操作集群外,还可以直接使用API来操作集群。如:通过API查看kubernetes版本信息:访问POD:kubernetesAPIResourcesspacekube-ap......
  • 微服务网关 APISIX 在 CentOS 7 下安装配置指南
    1.简介1.1.参考资源微服务网关的介绍和说明前面已有介绍,相关的文档可以参考以下链接。Nginx最大的问题是官方没有提供GUI方式的管理界面并且在群集方面的支持有限,所有配......
  • 8 个常用的JavaScript 比较运算符,你一定要知道
    英文|https://javascript.plainenglish.io/the-8-javascript-comparison-operators-you-need-to-know-cb952090d087翻译| 杨小爱1、相等我们将讨论的第一个比较运算符是......
  • 【JavaScript 教程】第六章 数组03— Stack :使用 Array 的push()和pop()方法实现堆栈
    英文 | https://www.javascripttutorial.net/译文|杨小爱在上节,我们学习了JavaScriptArray length属性以及如何正确处理它,错过的小伙伴可以点击文章《​​【JavaScrip......
  • JavaScript数组去重—ES6的两种方式
    说明JavaScript数组去重这个问题,经常出现在面试题中,以前也写过一篇数组去重的文章,(JavaScript数组去重的多种方法原理详解)但感觉代码还是有点不够简单,今天和大家再说两种......
  • vue3-组合式api-参数(props,context)及父子组件传值
    一、父组件<template> <div>  <h2>我是父组件</h2>  <div>counter:{{counter}}</div>  <button@click="callChildFun">调用子组件方法</button> ......
  • 实验7:基于REST API的SDN北向应用实践
    基本要求一.编写Python程序,调用OpenDaylight的北向接口实现以下功能(1)利用Mininet平台搭建下图所示网络拓扑,并连接OpenDaylight;打开OpenDaylight控制器./distribution-......