我有一个简单的问题,如果循环在外部,是否值得“缓存”DOM更改(对于循环,..)如果我有1000个即将到来的变化,它会带来巨大的性能提升(据我所知,不是我自己测量的),但如果我只替换这样的内容呢?
jQuery("#subMenu").html( jQuery( html ).find( "#subMenu" ).html() );
jQuery("#pageMain").html( jQuery( html ).find( "#pageMain" ).html());
jQuery("#text").html( jQuery( html ).find( "#text" ).html());
我能做这些
var cachedDOM = jQuery("body").html(); //edited
jQuery(cachedDOM).find("#pageMain").html( jQuery( html ).find( "#pageMain" ).html());
jQuery("body").html(cachedDOM);
它可能会更快,但我需要重新绑定所有事件,依此类推。在这种情况下缓存DOM真的更好吗?我不这么认为,但我想让页面尽可能快(特别是在较旧的IEs中)
谢谢
发布于 2011-07-23 07:37:56
总是使用JQuery的内置选择器,而不是尝试“缓存”和遍历变量。无论如何,从身体开始遍历是违反直觉的。
证明选择器比伪缓存快得离谱:http://jsperf.com/pseudo-dom-cache
发布于 2011-07-23 07:51:37
你的第二个代码甚至都不能生成.
$var cachedDOM = jQuery("body").html();
我想你的意思是
var $cachedDOM = jQuery("body").html();
然后这一行:
jQuery(cachedDOM)
是相对较慢的
您在该行上有效地克隆了web页面的整个HTML,因此您可以像搜索普通DOM一样对其进行搜索。使用你的第一种方法会快很多。我认为你正在寻找的那种缓存,它确实可以提供可变的速度提升,类似于:
var $body = jQuery("body");
$body.find("#pageMain").html($body.find("#pageMain").html());
速度的提升取决于选择器的复杂程度。例如,由于大多数版本的IE没有可供jQuery利用的document.getElementsByClassName()
函数,因此包含大量类的选择器将会相当慢,因此缓存结果是一个好主意。这方面的一个例子是:jQuery("div.left-column.highlighted li.link-list a.active");
,如果你在IE中用一个相当复杂的DOM运行1000次这样的行,与缓存一次并使用缓存999次相比,你可以得到显着的速度差异。
https://stackoverflow.com/questions/6798994
复制