当前位置: 首页 > 知识库问答 >
问题:

javascript - 关于MutationObserver 引发的 IntersectionObserver和ResizeObserver的callback类型?

班景龙
2023-12-30

MutationObserver 我们知道,他的callback会被加入到微任务队列中,后面在逛帖子的时候又遇到了 IntersectionObserver和ResizeObserver的callback ,我在想他们俩得callback是什么类型,然后去MDN上面看文档,发现MutationObserverMDN上面也没有明确说明(也可能是我看漏了)。IntersectionObserver和ResizeObserver也没有说明,所以才有了这个问题!

共有2个答案

丁俊爽
2023-12-30

有啊,在各自的构造函数小节都有介绍:

image.png

参考文档:
MDN-IntersectionObserver
MDN-ResizeObserver

补充

已知条件:
微任务: PromiseMutationObserver
宏任务:setTimeout

判断宏任务或微任务的方案如下(测试环境为 谷歌浏览器 ,不同浏览器可能有不同实现)

首先是 MutationObserver

console.log("代码开始");// MutationObserver (MDN确认为微任务)const observer = new MutationObserver((mutations) => {console.log("微任务", "mutation observer");});observer.observe(document.body, { childList: true });document.body.appendChild(document.createElement("div"));// promise 为微任务Promise.resolve().then(() => console.log("微任务", "promise then"));// 宏任务setTimeout(() => {console.log('宏任务');}, 0);console.log("代码结束");

输出结果为:

代码开始代码结束微任务 mutation observer微任务 promise then微任务 mutation observer宏任务

可以确认为微任务

再来看 IntersectionObserver

console.log("代码开始");// MutationObserver (MDN确认为微任务)const observer = new MutationObserver((mutations) => {console.log("mutation observer");});observer.observe(document.body, { childList: true });// 宏任务setTimeout(() => {console.log('宏任务');}, 0);const observer2 = new IntersectionObserver ((mutations) => {console.log("intersection observer");});observer2.observe(document.body);document.body.appendChild(document.createElement("div"));// promise 为微任务Promise.resolve().then(() => console.log("微任务", "promise then"));// 宏任务2setTimeout(() => {console.log('宏任务2');}, 0);console.log("代码结束");

输出为:

代码开始代码结束mutation observer微任务 promise thenmutation observerintersection observer宏任务宏任务2

显然,Intersection 也是微任务

最后是 ResizeObserver

console.log("代码开始");// MutationObserver (MDN确认为微任务)const observer = new MutationObserver((mutations) => {    console.log("mutation observer");});observer.observe(document.body, { childList: true });// 宏任务setTimeout(() => {    console.log('宏任务');}, 0);const observer2 = new ResizeObserver((mutations) => {    console.log("resize observer");});observer2.observe(document.body);document.body.style.width = '1000px'// promise 为微任务Promise.resolve().then(() => console.log("微任务", "promise then"));// 宏任务2setTimeout(() => {    console.log('宏任务2');}, 0);console.log("代码结束");

结果为:

代码开始代码结束微任务 promise thenmutation observerresize observer宏任务宏任务2

所以 ResizeObserver 也是微任务

夔修伟
2023-12-30

关于MutationObserver、IntersectionObserver和ResizeObserver的callback类型,MDN(Mozilla Developer Network)上确实没有明确说明。不过,一般来说,这些观察器的callback通常具有以下结构:

function callback(mutationsList, observer) {  // 处理观察到的变化}

其中,mutationsList是一个包含所有已观察到的变化的列表,而observer是观察器对象本身。

对于IntersectionObserver和ResizeObserver,它们的callback通常具有以下结构:

function callback(entries, observer) {  // 处理交集或尺寸变化}

其中,entries是一个包含所有观察目标的交集或尺寸变化的列表,而observer是观察器对象本身。

需要注意的是,具体的callback函数参数可能会有所不同,具体取决于你使用的库或框架。因此,最好查阅你所使用的库或框架的文档以获取更准确的信息。

 类似资料:
  • 本文向大家介绍关于JavaScript和jQuery的类型判断详解,包括了关于JavaScript和jQuery的类型判断详解的使用技巧和注意事项,需要的朋友参考一下 对于类型的判断,JavaScript用typeof来进行。 栗子: 可以看到,typeof并不能够准确的判断出每一种数据类型,比如null和数组等都是object类型。因此,JavaScript判断数据类型不推荐使用typeof。

  • 本文向大家介绍谈谈因Vue.js引发关于getter和setter的思考,包括了谈谈因Vue.js引发关于getter和setter的思考的使用技巧和注意事项,需要的朋友参考一下 起因 当我打印出Vue实例下的data对象里的属性时,发现了一个有趣的事情: 它的每个属性都有两个相对应的get和set方法,我觉的这是多此一举的,于是去网上查了查Vue双向绑定的实现原理,才发现它和Angular.js

  • 在中引用会调用闭包,只要在垃圾回收器周围保留就不会清理。问题是--会发生什么?即使它没有被引用,它也是由那个闭包持有的吗?垃圾回收器是否会看到没有引用并将其清理掉?还是只要我坚持,就会与一起存在?(理想的答案是引用ECMA规范。)

  • 网页开发时,常常需要了解某个元素是否进入了“视口”(viewport),即用户能不能看到它。 上图的绿色方块不断滚动,顶部会提示它的可见性。 传统的实现方法是,监听到scroll事件后,调用目标元素(绿色方块)的getBoundingClientRect()方法,得到它对应于视口左上角的坐标,再判断是否在视口之内。这种方法的缺点是,由于scroll事件密集发生,计算量很大,容易造成性能问题。 In

  • 本文向大家介绍老生常谈 关于JavaScript的类的继承,包括了老生常谈 关于JavaScript的类的继承的使用技巧和注意事项,需要的朋友参考一下 其实最一开始学JS的时候就看过继承的实现。当时只是去试着理解从书上看来的代码段而已。今天又重新思考了一下,感觉这是一个思维探索演进的结果。 继承,即复用。 如果抛开继承的固有思想,让b复用a的成员,最简单粗暴的做法, b=a; 那么,问题来了: 对

  • 我试图使用C# DI方法来实现一些东西。以下是我的代码片段。 以及创建ServiceLocator的代码: 现在,我用创建一个测试代码 但看起来,我总是得到函数返回的。相反,我希望通过函数获取object,那么如何正确地实现呢?