假设您有一个具有两个函数的Django视图:
第一个函数使用XSLT样式表呈现一些XML,并生成一个包含1000个子元素的div,如下所示:
<div id="myText">
<p id="p1"><a class="note-p1" href="#" style="display:none" target="bot">✽</a></strong>Lorem ipsum</p>
<p id="p2"><a class="note-p2" href="#" style="display:none" target="bot">✽</a></strong>Foo bar</p>
<p id="p3"><a class="note-p3" href="#" style="display:none" target="bot">✽</a></strong>Chocolate peanut butter</p>
(etc for 1000 lines)
<p id="p1000"><a class="note-p1000" href="#" style="display:none" target="bot">✽</a></strong>Go Yankees!</p>
</div>
第二个函数使用另一个样式表呈现另一个XML文档来生成这样的div:
<div id="myNotes">
<p id="n1"><cite class="note-p1"><sup>1</sup><span>Trololo</span></cite></p>
<p id="n2"><cite class="note-p1"><sup>2</sup><span>Trololo</span></cite></p>
<p id="n3"><cite class="note-p2"><sup>3</sup><span>lololo</span></cite></p>
(etc for n lines)
<p id="n"><cite class="note-p885"><sup>n</sup><span>lololo</span></cite></p>
</div>
我需要查看#myText中哪些元素具有与#myNotes中的元素匹配的类,并显示它们。我可以使用以下jQuery执行此操作:
$('#myText').find('a').each(function() {
var $anchor = $(this);
$('#myNotes').find('cite').each(function() {
if($(this).attr('class') == $anchor.attr('class')) {
$anchor.show();
});
});
然而,对于大量的比较来说,这是非常缓慢和低效的。
最快/最有效的方法是什么?是否有一个jQuery / js方法适用于大量项目?或者我是否需要重新设计Django代码才能将其传递给模板?
答案 0 :(得分:1)
这样的事情怎么样:
$('#myText a').each(function() {
$("#myNotes ." + $(this).attr('class')).show();
});
它只是将当前a
元素的类附加到选择器中,而不是对每个元素执行内部操作,并对找到的任何项目执行show()
。
答案 1 :(得分:1)
为了获得最佳性能,请创建一次索引,然后重复使用它:
function revealCite() {
var cites_index = $("#myText").data("cites_index");
// if no cached index exists, prepare one (one-time hit code section)
if (!cites_index) {
var cites = $("#myNotes cite");
var cites_count = cites.length();
var cites_index = {};
for (var i=0; i<cites_count; i++) {
var cite = cites[i], group = cites_index[cite.className];
if (!group) cites_index[cite.className] = [];
group.push(cite);
}
$("#myText").data("cites_index", cites_index);
}
// use the index to work with related elements ("this" must be an <a> element)
$(cites_index[this.className]).show();
}
现在以您喜欢的方式触发上述功能:
$("#myText a").each(revealCite);
PS:您也可以这样做,代替for循环:
cites.each( function() {
var group = cites_index[this.className];
if (!group) cites_index[this.className] = [];
group.push(this);
});
但它的代码行数相同,可能有点慢。
答案 2 :(得分:0)
我认为内部find
在外部each
的每次迭代中都是冗余重新执行的。尝试在循环开始之前将匹配的元素存储在变量中。我还调整了你的解决方案,通过DOM属性获取类名,而不是使用jQuery的attr
:
var $cites = $('#myNotes').find('cite');
$('#myText').find('a').each(function() {
var anchor = this;
$cites.each(function() {
if(this.className == anchor.className) {
$anchor.show();
});
});
答案 3 :(得分:0)
您应该使用Jquery的选择器来搜索您,而不是总是循环遍历每个元素并比较每个元素。 这应该会更快地运作:
$('#myText > a').each(function() {
var $anchor = $(this);
var anchor_class = $(this).attr('class');
var elements = $('#myNotes > cite[class=' + anchor_class + ']');
if (elements[0] != undefined) {
$anchor.show();
}
});