passive的原理是什么?有什么作用?

本篇文章给大家带来的内容是关于passive的原理是什么?有什么作用?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

passived到底有什么用?

passived主要用于优化浏览器页面滚动的性能,让页面滚动更顺滑~~

passived产生的历史时间线

addEventListener():大家都是认识的,为dom添加触发事件,故事就从这里开始。  
在早期addEventListener是这样的:

addEventListener(type, listener, useCapture)

登录后复制

useCapture:是否允许事件捕捉,但是很少会传true,然后就变成可选项了:

addEventListener(type, listener[, useCapture ])

登录后复制

到现在就变成了这个样子:

addEventListener(type, listener, {    capture: false, //捕获    passive: false,     once: false    //只触发一次})

登录后复制

我们的主角passive就出现了

passive为什么能优化页面的滚动性能?

简述chrome的线程化渲染框架

chrome的线程化渲染框架的两个线程:

内核线程(Main/Render Thread):负责DOM树构建、元素的布局、图层绘制记录部分(main-thread side)、JavaScript的执行

合成线程(Compositor Thread):图层绘制实现部分(impl-side)、图层图像合成

1370716566-5c05e6550da1f_articlex.png

上图可知,页面Frame#1在内核线程中完成js执行、布局和绘制后,经过一个周期合成线程去执行Frame#1页面图像的合成。

用户输入事件分类:

在内核线程处理的事件

直接由合成线程处理的事件

那么有什么区别呢?

在内核线程处理的事件:需要经过内核线程处理的输入事件要在内核线程执行逻辑,遇到内核线程在忙,无法立即响应。如用户的大部分输入事件都跟页面元素有关系,一旦页面元素注册了对应事件的监听器,监听器的逻辑代码(JavaScript)必须在内核线程中执行(V8引擎运行在内核线程),因此这种输入事件经常无法立即得到响应。
直接由合成线程处理的事件:不经过内核线程就能快速处理的输入事件为手势输入事件(滑动、捏合)。

划重点:最骚的来了,虽然手势事件可以不在内核线程处理,但是手势事件的产生还是离不开内核线程。

页面卡顿的原因

手势事件有个属性 cancelable,作用是告诉浏览器该事件是否允许监听器通过 preventDefault() 方法阻止,默认为true。如果在touch事件内部调用preventDefault(),事件默认行为被取消,页面也就静止不动了。但是浏览器并不知道touch事件内部是否调用了preventDefault(),浏览器只有等内核线程执行到事件监听器对应的JavaScript代码时,才能知道内部是否会调用preventDefault函数来阻止事件的默认行为,所以浏览器本身无法优化这种场景。手势输入事件是由连续的普通输入事件组成的,在这种场景下,无法快速产生,会导致页面无法快速执行滑动逻辑,从而让用户感觉到页面卡顿。

而Chrome团队从统计数据中分析得出,注册了mousewheel/touch相关事件监听器的页面中,80%的页面内部都不会调用preventDefault函数来阻止事件的默认行为。对于这80%的页面,即使监听器内部什么都没有做,相对没有注册mousewheel/touch事件监听器的页面,在滑动流畅度上,有10%的页面增加至少100ms的延迟,1%的页面甚至增加500ms以上的延迟。Chrome团队认为对于统计中的这80%的页面来说,他们都是不希望因为注册mousewheel/touch相关事件监听器而导致滑动延迟增加的。

passive的诞生

所以,passive 监听器诞生了,passive 的意思是“顺从的”,表示它不会对事件的默认行为说 no,浏览器知道了一个监听器是 passive 的,它就可以在两个线程里同时执行监听器中的 JavaScript 代码和浏览器的默认行为了。

经过上面的分析,我们了解到了Passive Event Listeners特性实际上是为了解决浏览器页面滑动流畅度而设计的,它通过扩展事件属性passive让Web开发者来告知浏览器监听器是否会阻止事件的默认行为,从而让浏览器可以更智能地决策并优化,这其中涉及到了Chrome的多线程渲染框架、输入事件处理等知识。

以上就是passive的原理是什么?有什么作用?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2735716.html

(0)
上一篇 2025年3月8日 01:18:03
下一篇 2025年3月8日 01:18:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JavaScript如何使用setTimeout()设置定时器

    在javascript中,通过给settimeout()方法设置需要调用的函数或要执行的代码串参数,和延迟的时间参数;在调用settimeout()方法就可以设置一个简单的定时器。 在JS中,提供了一些原生方法来实现在设定的时间间隔之后去执…

    2025年3月8日
    200
  • JavaScript中Object.create()的用法介绍

    本篇文章给大家带来的内容是关于JavaScript中Object.create()的用法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Object.create(null) 创建的对象是一个空对象,在该对象上没有继承…

    编程技术 2025年3月8日
    200
  • JavaScript中Proxy的详细介绍(代码示例)

    本篇文章给大家带来的内容是关于javascript中proxy的详细介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Proxy 让我们可以对任何对象的绝大部分行为进行监听和干涉,实现更多的自定义程序行为。 …

    编程技术 2025年3月8日
    200
  • JavaScript中Reflect的详细介绍(附示例)

    本篇文章给大家带来的内容是关于JavaScript中Reflect的详细介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Reflect 是一个内置的对象,它提供可拦截JavaScript操作的方法。方法与代理…

    编程技术 2025年3月8日
    200
  • JavaScript中import的详解(附示例)

    本篇文章给大家带来的内容是关于javascript中import的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 import 语句用于导入由另一个模块导出的绑定。无论是否声明了 strict mode,导入…

    编程技术 2025年3月8日
    100
  • redux的核心讲解(代码示例)

    本篇文章给大家带来的内容是关于redux的核心讲解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 概念 redux是一种架构模式,可以和react、vue结合使用。 解决的问题 优雅地修改共享数据状态,避免状态…

    2025年3月8日
    200
  • Vue封装ajax的代码示例详解

    本篇文章给大家带来的内容是关于vue封装ajax的代码示例详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 HTML文件: Document 点击获取信息 {{ msg }} var vm=new Vue({ el: “…

    编程技术 2025年3月8日
    200
  • JavaScrip的常见面试题及答案总结

    本篇文章给大家带来的内容是关于javascrip的常见面试题及答案总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一、请解释 JavaScript 中 this 是如何工作的。 首先:this 永远指向函数运行时所在的…

    编程技术 2025年3月8日
    200
  • JavaScript中let、var和const的区别及应用场景的介绍

    在javascript中,建议在使用变量和常量时声明变量名称(下面统称为“变量”)。var,let和const是在javascript中声明变量时使用的关键字,其中,let和const是ecmascript 2015采用的新声明方法的关键字…

    2025年3月8日
    200
  • JavaScript的历史对象是什么

    javascript的历史对象是 window 对象的一部分,表示用户访问过的url的数组集合;它是用来保存着用户上网的历史历史,从窗口被打开的那一刻算起。 本篇文章给大家介绍JavaScript的历史对象,让大家对History对象有一个…

    2025年3月8日
    200

发表回复

登录后才能评论