JavaScript之分时函数、分时间段渲染页面、提高用户体验、参数归一化、高阶函数、分段、appendChild、requestIdleCallback

news2024/9/21 2:48:36

MENU

  • 前言
  • 效果图
  • html
  • 原始写法
  • 优化方式一(参数归一化)
  • 优化方式二(当浏览器不支持requestIdleCallback方法的时候)
  • 优化方式三(判断环境)


前言

当前需要向页面插入十万个div元素,如果使用普通的渲染方式,会造成延迟。这时候就需要通过分时函数来实现渲染了。


效果图

timeSharing.png


html

<div class="w_680 d_f jc_sb">
    <div class="d_f fd_c ai_c">
        <button onclick="handleInsert()">插入1万个元素(原始写法)</button>

        <div id="idOld"></div>
    </div>

    <div class="d_f fd_c ai_c">
        <button onclick="handleOptimize()">插入1万个元素(优化后的写法)</button>

        <div id="idOptimize"></div>
    </div>
</div>

原始写法

function handleInsert() {
    let idOld = document.querySelector('#idOld'),
        datas = Array.from({ length: 100000 }, (_, i) => i + 1);

    for (const item of datas) {
        const div = document.createElement('div');

        div.textContent = item;
        idOld.appendChild(div);
    }
}

优化方式一(参数归一化)

function handleOptimize() {
    let datas = Array.from({ length: 100000 }, (_, i) => i + 1),
        idOptimize = document.querySelector('#idOptimize'),
        taskHandler = (item, i) => {
            const div = document.createElement('div');
            
            div.textContent = item;
            idOptimize.appendChild(div);
        };

    performChunk(datas, taskHandler);
    // performChunk(100000, taskHandler);
}

function performChunk(datas, taskHandler) {
	// 参数归一化
    if (typeof datas === 'number') datas = Array.from({ length: datas }, (_, i) => i + 1);
    if (datas.length === 0) return false;

    let i = 0;

    function _run() {
        if (i >= datas.length) return false;

        requestIdleCallback((idle) => {
            while (idle.timeRemaining() > 0 && i < datas.length) {
                taskHandler(datas[i], i);

                i++;
            }

            _run();
        });
    }

    _run();
}

优化方式二(当浏览器不支持requestIdleCallback方法的时候)

function handleOptimize() {
    let datas = Array.from({ length: 100000 }, (_, i) => i + 1),
        idOptimize = document.querySelector('#idOptimize'),
        taskHandler = (item, i) => {
            const div = document.createElement('div');
            
            div.textContent = item;
            idOptimize.appendChild(div);
        },
        scheduler = (task) => {
            setTimeout(() => {
                const start = Date.now();
                task(() => Date.now() - start < 50);
            }, 100);
        };

    performChunk(datas, taskHandler, scheduler);
}

function performChunk(datas, taskHandler, scheduler) {
    if (typeof datas === 'number') datas = Array.from({ length: datas }, (_, i) => i + 1);
    if (datas.length === 0) return false;

    let i = 0;

    function _run() {
        if (i >= datas.length) return false;

        scheduler((isGoOn) => {
            while (isGoOn() > 0 && i < datas.length) {
                taskHandler(datas[i], i);

                i++;
            }

            _run();
        });
    }

    _run();
}

优化方式三(判断环境)

function handleOptimize() {
    let datas = Array.from({ length: 100000 }, (_, i) => i + 1),
        idOptimize = document.querySelector('#idOptimize'),
        taskHandler = (item, i) => {
            const div = document.createElement('div');
            
            div.textContent = item;
            idOptimize.appendChild(div);
        }

    browserPerformChunk(datas, taskHandler);
}

function browserPerformChunk(datas, taskHandler) {
    const scheduler = (task) => {
        requestIdleCallback((idle) => {
            task(() => idle.timeRemaining() > 0);
        });
    };

    performChunk(datas, taskHandler, scheduler);
}

function performChunk(datas, taskHandler, scheduler) {
    if (typeof datas === 'number') datas = Array.from({ length: datas }, (_, i) => i + 1);
    if (datas.length === 0) return false;

    let i = 0;

    function _run() {
        if (i >= datas.length) return false;

        scheduler((isGoOn) => {
            while (isGoOn() > 0 && i < datas.length) {
                taskHandler(datas[i], i);

                i++;
            }

            _run();
        });
    }

    _run();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【R数据分析-基础】

R语言介绍 为什么使用R&#xff1f; R&#xff1a;数据分析与可视化平台 R的获取和安装 http://cran.r-project.org 免费下载 一、R、Rtools安装 R语言&#xff1a; 免费开源 支持多平台&#xff0c;包括Windows、UNIX、Mac OS 擅长统计与可视化 Rtools&#xff1a;R语言…

Android安卓写入WIFI热点自动连接NDEF标签

本示例使用的发卡器&#xff1a;Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/网址/海报-淘宝网 (taobao.com) package com.usbreadertest;import android.os.Bundle; import android.view.MenuItem; import android.view.View; import android.widget.EditText; impo…

C++从入门到出门

C 概述 c 融合了3中不同的编程方式&#xff1a; C语言代表的过程性语言C 在C语言基础上添加的类代表的面向对象语言C 模板支持的泛型编程 1、在c语言中头文件使用扩展名.h,将其作为一种通过名称标识文件类型的简单方式。但是c得用法改变了&#xff0c;c头文件没有扩展名。但是…

大数据平台搭建2024(二)

二&#xff1a;Hive安装 只在node01上操作 1 安装MySQL 8.0 最小化安装需要安装这个 yum install -y wget1-1 下载MySQL的yum源 wget http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm检查是否安装成功 rpm -qpl mysql80-community-release-el7-7.n…

[Collection与数据结构] 二叉树(三):二叉树精选OJ例题(下)

1.二叉树的分层遍历 OJ链接 上面这道题是分层式的层序遍历,每一层有哪些结点都很明确,我们先想一想普通的层序遍历怎么做 /*** 层序遍历* param root*/public void levelOrder1(Node root){Queue<Node> queue new LinkedList<>();queue.offer(root);while (!qu…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制伊甸火山3D网格曲面图

11.4.2小节我们使用3D曲面图可视化分析伊甸火山数据&#xff0c;本小节我们采用3D网格曲面图可视化分析伊甸火山数据&#xff0c;以展示其地形&#xff0c;具体示例代码如下。 购书地址&#xff1a;https://item.jd.com/14102657.html

C语言开源库iniparser解析ini文件

1 ini文件介绍 INI&#xff08;Initialization File&#xff09;文件是一种简单直观的数据存储格式&#xff0c;常用于配置应用程序的初始化设置。这种文件通常包含若干个节&#xff08;section&#xff09;和键值对&#xff08;key-value pairs&#xff09;。INI文件的每一部…

数据结构10:堆和堆排序

文章目录 树的概念及结构树的概念树的相关概念树的表示树在实际中的应用表示文件系统的目录树结构 二叉树概念及结构概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 二叉树的顺序结构及实现二叉树的顺序结构堆的概念及结构 堆的实现堆的插入堆的删除堆的创建向…

【大数据】TiDB: A Raft-based HTAP Database

文章目录 数据库知识介绍数据库系统的ACID特性分布式系统和CAP理论关系型数据库与非关系型数据库关系型数据库非关系型数据库 OldSQL、NoSQL、NewSQLOldSQLNoSQLNewSQL OLTP、OLAP、HTAP 前言&#xff1a;为什么选择TiDB学习&#xff1f;pingCAP介绍TiDB介绍TiDB的影响力TiDB概…

Wireshark TS | 再谈应用传输缓慢问题

问题背景 来自于朋友分享的一个案例&#xff0c;某某客户反馈电脑应用软件使用时打开很慢&#xff0c;并提供了一个慢时所捕获的数据包文件以及服务端 IP。以前也说过&#xff0c;所谓的慢有很多种现象&#xff0c;也会有很多原因引起&#xff0c;在没有更多输入条件的情况下&…

Redis集合[持续更新]

Redis&#xff08;全称&#xff1a;Remote Dictionary Server 远程字典服务&#xff09;是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库&#xff0c;并提供多种语言的 API。 数据结构 1. string 字符串 字符串类型是 Redis 最…

云知识库怎么搭建才适合中小企业?用这几个工具很轻松

当我们想到知识库时&#xff0c;可能会联想到庞大的公司和复杂的系统&#xff0c;但实际上&#xff0c;随着技术的发展&#xff0c;中小企业也可以利用各种工具来建立自己的云知识库。这样不仅能够提升企业的知识管理效率&#xff0c;还能优化客户服务流程。这篇文章会介绍三款…

【QT+QGIS跨平台编译】182:【QGIS+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、qgis模块介绍二、QGIS下载三、文件分析四、pro文件五、编译实践一、qgis模块介绍 qgis模块作为QGIS启动模块,集成底层所有的模块。 二、QGIS下载 QGIS网址: QGIS Source Download 获取qgis.tar.bz2文件。 三、文件分析 解压缩qgis.tar.bz2文件,进入到qgis\…

编写Spark独立应用程序

执行本文之前&#xff0c;先搭建好spark的开发环境&#xff0c;我目前只搭建了standalone模式&#xff0c;参考链接 &#xff1a; Spark Standalone模式部署-CSDN博客 1. 安装sbt 1&#xff09;下载sbt 网址&#xff1a;https://www.scala-sbt.org/download.html &#xff0c…

# Win10 打不开【本地组策略编辑器】解决方案

Win10 打不开【本地组策略编辑器】解决方案 段子手168 问题描述&#xff1a; 当在 WIN R 打开【运行】输入&#xff1a;gpedit.msc 打开【本地组策略编辑器】时&#xff0c;出现错误时&#xff0c; 或者在【计算机管理】中 没有【本地用户和组】这一项。 可以试一下以下方…

8.MMD ray渲染主流常用插件介绍

导入一个场景&#xff0c;做好基础操作 导入控制器、天空盒、材质 1. AutoLuminous4 自发光的插件 ![[Pasted image 20240421103420.png]] 拖进去以后可以让场景中的自发光材质发光 也可以让不发光的材质强行发光 打开MME&#xff0c;找到AL_EmitterRT 展开场景&#x…

解线性方程组——直接解法:LU分解、PLU分解(类似列主元消去法) | 北太天元

L: lower triangular 下三角 U: upper triangular 上三角 LU 分解&#xff0c;顾名思义&#xff0c;为 把一个 矩阵 分成 一个下三角矩阵 乘上一个上三角矩阵的形式。 Example 为什么可以这样 几个基本的初等行变换&#xff0c;可以自己验算一下&#xff0c;等式的左边与右边…

spring高级篇(二)

1、Aware和InitializingBean Aware和InitializingBean都与Bean的生命周期管理相关。 Aware接口: 概念: Aware接口是Spring框架中的一个标记接口&#xff0c;它表示一个类能够感知到&#xff08;aware of&#xff09;Spring容器的存在及其特定的环境。Spring框架提供了多个Awar…

一周学会Django5 Python Web开发-Django5模型数据修改

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计47条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

小图标还不会设计!

ICON图标设计 hello&#xff0c;我是小索奇 image-20230805225451447 你有好奇过这样的图标如何设计的吗&#xff1f; 其实非常简单&#xff0c;仅需要一行代码即可完成&#xff0c;本篇文章就带伙伴们使用&#xff0c;每天看一篇&#xff0c;简单易懂&#xff0c;日久技长~…