MutationObserver 我们知道,他的callback会被加入到微任务队列中,后面在逛帖子的时候又遇到了 IntersectionObserver和ResizeObserver的callback ,我在想他们俩得callback是什么类型,然后去MDN上面看文档,发现MutationObserverMDN上面也没有明确说明(也可能是我看漏了)。IntersectionObserver和ResizeObserver也没有说明,所以才有了这个问题!
有啊,在各自的构造函数小节都有介绍:
参考文档:
MDN-IntersectionObserver
MDN-ResizeObserver
已知条件:
微任务: Promise
、MutationObserver
宏任务: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
也是微任务
关于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,那么如何正确地实现呢?