zoukankan      html  css  js  c++  java
  • 前端性能优化(十七)

    对用户输入事件的处理去抖动

    用户输入事件处理函数是一个可能会导致web应用性能问题的因素,因为它们在运行时会阻塞帧的渲染,并且会导致额外且不必要的布局的发生。

    避免使用运行时间过长的输入事件处理函数

    在理想情况下,当用户在设备屏幕上触摸了页面上某个位置时,页面的渲染层合并线程将接收到这个触摸事件并作出响应,比如移动页面元素。这个响应过程是不需要浏览器主线程的参与的,也就是说,不会导致JavaScript、布局和绘制过程的发生。

    Lightweight scrolling; compositor only.

    但是,如果你对这个被触摸的元素绑定了输入事件处理函数,比如touchstarttouchmove或者touchend,那么渲染层合并线程必须等待这些被绑定的处理函数的执行完毕之后才能被执行。因为你可能在这些处理函数中调用了类似preventDefault()的函数,这将会阻止输入事件(touch/scroll等)的默认处理函数的运行。事实上,即便你没有在事件处理函数中调用preventDefault(),渲染层合并线程也依然会等待,也就是用户的滚动页面操作被阻塞了,表现出的行为就是滚动出现延迟或者卡顿(帧丢失)。

    Heavy scrolling; compositor is blocked on JavaScript.

    简而言之,你必须确保对用户输入事件绑定的任何处理函数都能够快速执行完毕,以便腾出时间来让渲染层合并线程来完成它的工作。

    避免在输入事件处理函数中修改样式属性

    输入事件处理函数,比如scroll/touch事件的处理,都会在requestAnimationFrame之前被调用执行。

    因此,如果你在上述输入事件的处理函数中做了修改样式属性的操作,那么这些操作会被浏览器暂存起来。然后在调用requestAnimationFrame的时候,如果你在一开始做了读取样式属性的操作,那么根据“避免大规模、复杂的布局”中所述,你将会触发浏览器的强制同步布局过程!

    Heavy scrolling; compositor is blocked on JavaScript.

    对滚动事件处理函数去抖动

    有一个方法能同时解决上面的两个问题:对样式修改操作去抖动,控制其仅在下一次requestAnimationFrame中发生:

    function onScroll (evt) {
    
      // Store the scroll value for laterz.
      lastScrollY = window.scrollY;
    
      // Prevent multiple rAF callbacks.
      if (scheduledAnimationFrame)
        return;
    
      scheduledAnimationFrame = true;
      requestAnimationFrame(readAndUpdatePage);
    }
    
    window.addEventListener('scroll', onScroll);

    这么做还有一个额外的好处,就是能使你的事件处理函数变得轻量。这很关键,因为它能使包含复杂计算代码的页面也能快速响应scroll/touch事件!

  • 相关阅读:
    Postgresql中string转换成timestamp类型
    zTree节点重叠或者遮挡
    Powerdesigner+Execel
    Powerdesigner+PostgreSQL
    PostgreSQL 的 distinct on 的理解
    PostgreSql问题:ERROR: operator does not exist: timestamp without time zone > character varying
    git分支小问题
    SSH问题:系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常
    PostgresSQL中的限制和级联删除
    sql语句添加删除外键及其约束
  • 原文地址:https://www.cnblogs.com/LiJianBlog/p/4820254.html
Copyright © 2011-2022 走看看