【发布时间】:2012-02-03 13:09:06
【问题描述】:
不幸的是,我需要遍历页面的所有 DOM 元素,我想知道最有效的技术是什么。我可能会自己对这些进行基准测试,如果我有时间也可能会这样做,但我希望有人已经经历过这一点,或者有一些我没有考虑过的选项。
目前我正在使用 jQuery 并这样做:
$('body *').each(function(){
var $this = $(this);
// do stuff
});
虽然它有效,但似乎会导致客户端出现一些延迟。也可以使用更具体的 jQuery 上下文(如 $('body', '*'))对其进行调整。我突然想到本机 Javascript 通常比 jQuery 快,我发现了这一点:
var items = document.getElementsByTagName("*");
for (var i = 0; i < items.length; i++) {
// do stuff
}
我假设原生选项更快。想知道是否还有其他我没有考虑过的选择。也许是一个并行迭代子节点的递归选项。
【问题讨论】:
-
是的,原版 DOM 方式会更快。但是为什么你需要遍历所有元素呢?
-
缓存你的 items.length 这样你就不会在循环的每次迭代中都计算它,但是是的,带有 DOM 调用的 for 循环将比 .each 更快
-
@jamietre jQuery 也不能很好地优化“body *”。仅使用“body”就可以了,但是如果您使用“body *”,它会使用 sizzle JS。这意味着它最终会调用
document.querySelectorAll('body *'),但它必须先运行大约 200 行 Javascript 代码才能决定这样做,包括正则表达式测试和其他事情。这可能看起来不多,但与document.body.getElementsByTagName('*')相比,它很多。 -
@jamietre 我相信您发现 jQuery 更快的原因是因为您使用的是
document.querySelectorAll('*')而不是document.querySelectorAll('body *')或document.body.querySelectorAll('*')。我相应地更新了您的测试:jsperf.com/js-vs-jquery-select-all/2 -
@jamietre 我正在编写一个包含在用户页面中的第三方库。我不知道他们的设计或标记是什么样的。我们的库注入了一个固定元素(标题栏),可能会导致与他们的设计重叠。为了防止这种情况,我们相应地移动它们的任何位置:固定元素。我唯一能假设的是它们可能在 body 元素中有 position:fixed 元素。
标签: javascript jquery performance dom optimization