javascript - Javascript:优化 iFrame 的重新排序,如 DOM 节点
问题描述
我的应用程序有一个 WebView 控件,里面有一个 HTML 页面。
该页面由每个包含一个 iFrame 的 div 组成,因此当许多 div 是 document.body 的子级时,所有 iFrame 本身就像 HTML 页面一样,一个接一个。
div 有一个名为 orderIndex 的属性,因为它们必须根据索引数组进行排序。
(iFrame 在排序时已经加载)
这些索引是新位置,因此例如 orderIndexesArray[0] 包含第一个孩子必须达到的新位置。
我在以下位置找到了一些排序方法:
https://stackoverflow.com/a/39569822/930835
我改编了这个
var bd = document.body;
Array.prototype.slice.call(bd.children)
.map(function (x) { return bd.removeChild(x); })
.sort(function (x, y) { return /* your sort logic, compare x and y here */; })
.forEach(function (x) { bd.appendChild(x); });
我希望排序过程不像“快速重新排序 HTML 页面的闪烁部分”,而是我希望重绘从第一个开始,因此页面的可见部分被替换为没有太多闪烁。
我也关心性能。HTML 和 Javascript 不是我的主要编程环境。
那么,该算法是从顶部重绘并表现良好,还是它包含大量交换并且速度很慢?
解决方案
它的性能与您将要获得的一样高,因为排序(以及因此交换)是在不再位于 DOM 中的 DOM 元素数组中完成的,因此不会导致重绘/重排。
就 DOM 而言,唯一的动作是当每个正确排序的元素随后一个接一个地添加回 DOM 时。
这应该没问题;如果您有很多元素,您可能会通过将整个重新排序的 HTML 一次性转储到 DOM 中来观察到一些优势,而不是一个接一个地转储每个元素。
let bd = document.body,
newHTML = Array.prototype.slice.call(bd.children)
.map(el => bd.removeChild(el))
.sort(function (x, y) { return /* your sort logic, compare x and y here */; })
.map(el => el.outerHTML);
bd.innerHTML += newHTML.join('');
推荐阅读
- node.js - 如何使用 React 和节点将视频流发送到 RTMP 服务器
- sql - 如何根据 SQL 中的特定条件恢复备用记录?
- python-3.x - 一遍又一遍地生成相同的 pygame 事件
- regex - vim regex - 在行尾匹配任意数量的空格,除了 2
- python-3.x - 如何使用 realsense(L515 相机)找到物体的尺寸
- node.js - pg(postgresql) 在使用 pg 库的节点 js 中不起作用
- touchgfx - 带硬件编码轮的 TouchGFX
- docker - 无法在 kubernetes (Docker) 中运行 powershell(pwsh) linux 映像
- python - python manage.py dumpdata 无法序列化数据库
- javascript - 换行 - React Prop