使用JavaScript高效地执行多个DOM更新
我有一个包含数百个div元素的HTML/JS网站。其中几十个元素应一次快速更新(每秒最多更新250次)(即,它们都应一次更新,而无需浏览器通过逐个执行更新来执行不必要的工作)。什么是最有效的方法(最小化CPU负载和内存消耗)来实现这一点?支持现代浏览器使用纯JavaScript或简单的库(不使用或类似的库要求我修改DOM处理之外的代码)来实现这一点?我正在寻找类似的东西(其中imaginaryLibrary是我不知道的图书馆,我正在寻找):使用JavaScript高效地执行多个DOM更新,javascript,performance,dom,Javascript,Performance,Dom,我有一个包含数百个div元素的HTML/JS网站。其中几十个元素应一次快速更新(每秒最多更新250次)(即,它们都应一次更新,而无需浏览器通过逐个执行更新来执行不必要的工作)。什么是最有效的方法(最小化CPU负载和内存消耗)来实现这一点?支持现代浏览器使用纯JavaScript或简单的库(不使用或类似的库要求我修改DOM处理之外的代码)来实现这一点?我正在寻找类似的东西(其中imaginaryLibrary是我不知道的图书馆,我正在寻找): vari,元素; 对于(i=0;i
vari,元素;
对于(i=0;i<20;i++){
元素=document.getElementById('el'+i);
collectDomUpdate(元素,cssClass,'updatedcsslass');
}
//执行之前在循环中收集的DOM更新,并在一次回流中应用DOM更新
imaginaryLibrary.applyUpdate();
要更新的元素的父元素包含数千个不应更新的元素。似乎您已经掌握了要执行的基本操作。对于您的特定用例,我认为没有理由不简单地实现这些方法
var imaginaryLibrary = function() {
var toProcess = [];
function collectDomUpdate(el, prop, newValue) {
toProcess.push([el, prop, newValue])
}
function applyUpdates() {
while (toProcess.length) {
var actions = toProcess.pop()
actions[0][actions[1]] = actions[2]
}
}
}
上面的代码是您可能要执行的操作的框架,它不包含错误检查,并且直接分配给对象,而不是潜在地使用DOM属性。您需要“脱机”执行DOM更新。根据您的需求,它可能与使用display一样:在父容器的CSS中无,执行更新,然后取消隐藏所述容器。通过从DOM中删除节点并在操作后重新插入节点,可以更手动地执行类似操作
如果在元素的显示中导致可察觉的或其他不可接受的间隙,那么您可能需要考虑一个解决方案,即复制节点、操作它们,然后在适当的位置重写较旧的节点。可能需要小心,多做一些研究,以确保这不会导致浏览器一直实例化一堆新元素。也许是一个节点的“池”
你并不确切地知道你在做什么,我们在这里能做的最好的事情就是给你一些相关领域的一般性建议 DOM修改 您并没有完全填写您尝试执行的操作的所有细节,但在优化代码工作方式时,需要考虑以下几点:var imaginaryLibrary = function() {
var toProcess = [];
function collectDomUpdate(el, prop, newValue) {
toProcess.push([el, prop, newValue])
}
function applyUpdates() {
while (toProcess.length) {
var actions = toProcess.pop()
actions[0][actions[1]] = actions[2]
}
}
}