html DOM 节点限制

2024-01-15

我正在开发一个终端模拟器以获取乐趣,并了解后端的基础知识和运行。然而,我不断遇到前端的性能问题。

大家可能都知道,终端窗口中的每个字符都可以有不同的样式。 (颜色、背景、粗体、下划线等)。所以我的想法是使用<span>对于视图窗口中的每个字符,并在必要时应用内联样式,以便我拥有所需的控制程度。

问题是刷新时的性能非常糟糕。 Chrome 在我的电脑上可以每秒处理大约 120 次操作,而 Firefox 可以每秒处理 80 次。但是 Internet Explorer 几乎只能达到 6 次。所以在我使用 html 后,我尝试使用画布,但画布上的文本非常慢。我在网上读到缓存有帮助,因此我为每个字符实现了一个缓存,并且可以通过一些复合操作将颜色应用于当时的位图字体。然而这比 DOM 慢得多。

然后我回到dom并尝试使用document.createDocumentFragment但它的性能比仅使用标准要差一些。

我现在不知道从哪里开始优化。我可以跟踪字符何时发生变化,但是当终端获得大量输入时,我仍然会遇到这种缓慢的情况。

我是 DOM 新手,所以我可能会做一些完全错误的事情......

任何帮助表示赞赏!

这是一个带有一些测试用例的 jsperf:

http://jsperf.com/canvas-bitma32p-cache-test/6 http://jsperf.com/canvas-bitma32p-cache-test/6


当您使用时,将 HTML 作为字符串文本直接插入的效率惊人insertAdjacentHTML将 HTML 附加到元素。

var div = document.getElementById("output");
var charCount = 50;
var line, i, j;

for (i = 0; i < charCount; i++) {
  line = "";
  for (j = 0; j < charCount; j++) {
    line += "<span style=\"background-color:rgb(0,0,255);color:rgb(255,127,0)\">o</span>";
  }
  div.insertAdjacentHTML("beforeend","<div>"+line+"</div>");
}
#output{font-family:courier; font-size:6pt;}
<div id="output"></div>

这种方法的缺点是显而易见的:您永远没有机会将每个附加元素视为 JavaScript 中的对象(它们只是普通字符串),因此您无法直接将事件侦听器附加到每个元素。 (您可以在事后通过使用以下命令查询结果 HTML 中的匹配元素来执行此操作document.querySelectorAll(".css selector).)

如果您确实只是格式化打印到屏幕上的输出,insertAdjacentHTML是完美的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

html DOM 节点限制 的相关文章

  • 如何按照编写的顺序迭代 javascript 对象属性

    我发现了代码中的一个错误 我希望通过最少的重构工作来解决该错误 此错误发生在 Chrome 和 Opera 浏览器中 问题 var obj 23 AA 12 BB iterating through obj s properties for
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • Ember.js 处理 View 事件后转换到路由

    Setup 我有一个 Ember 应用程序 支持使用 Imgur API 上传图像 我已经有一个工作路线和模板来处理任何 Imgur ID 但我想在上传新图像后转换到此路线 使用返回的 Imgur ID 这是该应用程序的相关部分 http
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • 如何使用 JavaScript 获取没有 HTML 元素的纯文本?

    我的 HTML 中有 1 按钮和一些文本 如下所示 function get content I don t know how to do in here
  • 如何通过php获取网页的Open Graph协议?

    PHP 有一个简单的命令来获取网页的元标记 get meta tags 但这仅适用于具有名称属性的元标记 然而 开放图谱协议如今变得越来越流行 从网页获取 opg 值的最简单方法是什么 例如 我看到的基本方法是通过 cURL 获取页面并使用
  • Jquery 中的动态滚动位置

    请帮助我解决以下情况 我有 3 个页面 当滚动到达第二页时 用户滚动页面 它必须找到特定的 ID 然后触发一个函数 一旦第三页开始 另一个函数就会触发 根据要求我不应该使用任何插件
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 是否有任何非轮询方式来检测 DOM 元素的大小或位置何时发生变化?

    很长一段时间以来 我一直在寻找一种方法来检测 DOM 元素的大小或位置何时发生变化 这可能是因为窗口调整了大小 或者因为向该元素添加了新的子元素 或者因为在该元素周围添加了新元素 或者因为 CSS 规则已更改 或者因为用户更改了浏览器的字体
  • 如何在 Angular 中从父组件访问子组件?

    I have mat paginator在子组件a中 如下所示 子组件 html
  • 如何使JavaScript函数在Eclipse“大纲视图”中可见?

    我有这样的代码 但如果它在匿名函数中定义 则无法打开函数大纲 类没有问题 我该如何概述something2 请分享一些提示 我可以将所有函数标记为构造函数 但这是无效的方法 start of track event required deb
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • 将数组排序为第一个最小值、第一个最大值、第二个最小值、第二个最大值等

    编写一个JS程序 返回一个数组 其中第一个元素是第一个最小值 第二个元素是第一个最大值 依此类推 该程序包含一个函数 该函数接受一个参数 一个数组 该函数根据要求返回数组 输入示例 array 2 4 7 1 3 8 9 预期输出 1 9
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • 在 Javascript 中减少/分组数组

    基于this https stackoverflow com a 40774906 3254598例如 我想以稍微不同的方式按对象进行分组 结果应该如下 key audi items make audi model r8 year 2012
  • 如何在打字稿文件中导入没有定义文件的js库

    随着我们的项目变得越来越大 我想从 JavaScript 切换到 TypeScript 以帮助进行代码管理 然而 我们使用许多库作为 amd 模块 我们不想将其转换为 TypeScript 我们仍然想将它们导入 TypeScript 文件
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值

随机推荐

  • 当数据可用时,组合框自动选择第一项

    我正在寻找在数据可用时选择第一项的方法 但如果源中没有数据 则不要选择 怎么做 我对 WPF 很陌生
  • 使用 @babel/preset-typescript 从环境 TypeScript 模块中使用枚举?

    是否可以食用enum来自正在编译的文件babel using babel preset typescript mymodule d ts declare module mymodule export enum Fruit apple App
  • 表达式中括号组的 ISO C 等效项

    如何以符合 ISO C99 的方式执行以下操作 define MALLOC type length message type a LINE type malloc length sizeof type assert message a LI
  • C#7 值元组/解构不对称

    在这里摆弄 https dotnetfiddle net 9Ex5Jp 给定一个函数 string a string b F 您可以解构它返回的元组 var a b F string c string d F 或者你可以直接分配它 var
  • Python GIL 真的是针对每个解释器的吗?

    我经常看到人们谈论 GIL 是每个 Python 解释器的 甚至在 stackoverflow 上也是如此 但我在源代码中看到 GIL 似乎是一个全局变量 因此每个 python 进程中的所有解释器都有一个 GIL 我知道他们这样做是因为没
  • 通过 bonjour 在两个 iOS 设备之间流式传输图像

    我的目标是通过 bonjour 将 AVCaptureOutput 捕获的图像从一台 iOS 设备流式传输到另一台设备 这是我当前的方法 1 从视频输入中捕获帧 void captureOutput AVCaptureOutput capt
  • 如何解决React Native应用程序中的TapJacking漏洞

    我知道我可以在我的视图中应用这些属性 filterTouchesWhenObscured 方法 onFilterTouchEventForSecurity 但我想应用于我的每个可点击视图 那么我该如何应用它 我今天需要修复窃听场景 对我的应
  • 从 VPC 内部访问 VPC 外部的 AWS 资源 - 无服务器框架

    我正在尝试从 VPC 内部的 lambda 函数访问 VPC 外部的运动流 目前 当执行写入 kinesis 流的代码时 它将挂起 然后超时 当我将 lambda 从 VPC 中取出时 写入流的代码工作正常 但我需要访问 VPC 内的资源
  • 缓存控制标头和浏览器缓存 IIS7

    我在 IIS7 的网站上使用 Google Page Speed 我想知道如何设置 利用浏览器缓存 以下资源缺少缓存过期时间 利用代理缓存 考虑向以下资源添加 Cache Control public 标头 以web config中的sys
  • 在线性回归模型中包含误差项

    我想知道是否有一种方法可以包含线性回归模型的误差项 例如 r lm y x1 x2 代码r lm y x1 x2 意味着我们将 y 建模为 x1 和 x2 的线性函数 由于模型并不完美 因此会存在残差项 即模型未能拟合的剩余项 在数学方面
  • linq orderby 使用属性名称字符串

    我有一个需要订购的清单 例如 var list someelements 我还有一个参数 它说明我应该按哪个属性和哪个方向订购列表数据 例如 var sortby Name var sortdirection desc 我想知道是否可以将字
  • 如何让 AutoMapper 不缓存映射对象?

    当 AutoMapper 遇到一个已经映射的对象时 它似乎会再次使用该对象 而不是尝试重新映射它 我相信它这样做是基于 Equals 我有一棵正在绘制地图的树 因此 一个具有一些属性和子节点的节点 多个节点具有相同的值 Equals 因为它
  • 渲染后如何将焦点设置在输入字段上?

    渲染组件后将焦点设置在特定文本字段上的反应方式是什么 文档似乎建议使用 refs 例如 Set ref nameInput 在渲染函数中的输入字段上 然后调用 this refs nameInput getInputDOMNode focu
  • 如何使用 openjdk:7 Docker 镜像和 Gradle 包装器避免“EC 参数错误”?

    这个 Dockerfile FROM openjdk 7 WORKDIR restdocs RUN git clone https github com spring projects spring restdocs git restdoc
  • Jackson反序列化convertValue与readValue

    我有一个包含 JSONObjects 的 org json JSONArray 我正在尝试将它们映射到 POJO 我知道我想要映射到的 POJO 的类型 我有两个选择 我正在尝试找出哪个性能更好 选项1 ObjectMapper mappe
  • 在 php 中使用断言进行类型检查?

    我使用异常抛出函数对 php 中的类中的参数进行了一些检查 我有进行基本检查的功能 in array等 并在 false 时抛出异常 所以我可以做assertNumeric argument argument is not numeric
  • 使用 AngularJS 和 Highlight.js 进行动态语法突出显示

    我正在构建一个网站来说明常见的应用程序漏洞 例如 SQL 注入 我在用AngularJS and 高亮 js创建交互式示例 如何让 AngularJS 和highlight js 都更新我的代码片段 Example 这把小提琴 http j
  • 重复使用表格单元格中的 UIswitch

    我的 uiswitch 有问题UITableViewCell每当我更改属于特定部分的特定单元格中的开关值时 所有其他具有相同部分的单元格inexPath row改变 请帮忙 这是我的代码cellForRowAtIndexPath metho
  • 把一个偶数分成N份,每份都是2的倍数

    假设我有号码100我需要将其分为 N 部分 每个部分最初不应超过 30 因此初始分组为 30 30 30 余数 即 10 将通过连续向每个组添加 2 来分配到这三个组中 从而确保每个组都是 2 的倍数 因此 所需的输出应类似于 34 34
  • html DOM 节点限制

    我正在开发一个终端模拟器以获取乐趣 并了解后端的基础知识和运行 然而 我不断遇到前端的性能问题 大家可能都知道 终端窗口中的每个字符都可以有不同的样式 颜色 背景 粗体 下划线等 所以我的想法是使用 span 对于视图窗口中的每个字符 并在