Javascript jQuery:add()性能;有更好的办法吗?
我想做的是:将页面上所有类似的元素(某种类型)组合到一个对象中,我可以稍后对其进行迭代,或者对其中的每个元素应用彻底的更改 我的代码成功地完成了给定的任务,但当元素数量增加到200-300+时,性能会急剧下降,用户已经注意到了。我已经分离出了有问题的代码行,想知道是否有其他方法可以解决同样的问题 add()函数似乎是一个有问题的操作,它基于我在其周围放置的计时器。开始时,执行该操作所需的时间为.001,但会不断增加,直到元素数达到300,并且每增加一个元素需要大约.1秒的时间,并且会继续减慢 我有()的jQuery性能增强功能,并实现了其中的一些功能(即3),但它们没有给我任何有意义的性能提升。令人惊讶的是,对于Firefox(300多次调用add())来说,这段代码只需1秒(!),而Chrome和IE大约需要10-20倍或更长的时间 这是我的密码:Javascript jQuery:add()性能;有更好的办法吗?,javascript,jquery,arrays,performance,add,Javascript,Jquery,Arrays,Performance,Add,我想做的是:将页面上所有类似的元素(某种类型)组合到一个对象中,我可以稍后对其进行迭代,或者对其中的每个元素应用彻底的更改 我的代码成功地完成了给定的任务,但当元素数量增加到200-300+时,性能会急剧下降,用户已经注意到了。我已经分离出了有问题的代码行,想知道是否有其他方法可以解决同样的问题 add()函数似乎是一个有问题的操作,它基于我在其周围放置的计时器。开始时,执行该操作所需的时间为.001,但会不断增加,直到元素数达到300,并且每增加一个元素需要大约.1秒的时间,并且会继续减慢 我
rowsToChange = $([]);
// Grab all the ids greater than whichever one I'm currently looking at:
var arr = $.makeArray($("[id^=stackLocatorLinkFillUp]:gt("+(uniqueID-1)+")"));
for (var i=0; i<arr.length; i++) {
$this = arr[i];
// <<< VARIOUS CONDITIONALS that make this as selective as possible REMOVED >>>
startTimer = new Date().getTime();
// **************************
// PROBLEMATIC LINE FOLLOWS when 200+ records:
rowsToChange = rowsToChange.add($this);
// Grows from .001 to .1xx after 300 iterations
console.log("innertiming:"+(new Date().getTime() - startTimer)/1000);
// **************************
}
rowsToChange=$([]);
//获取所有大于我当前查看的ID:
var arr=$.makeArray($(“[id^=stackLocatorLinkFillUp]:gt(“+(uniqueID-1)+”);
对于(var i=0;i),但我更愿意继续收集对象列表,以便最后一行可以发挥其魔力
(指出下面的说法是错误的——关于连接;谢谢‘不是我’)
似乎add()操作必须连接字符串,因为这似乎是其他人面临的主要问题之一。但是将add()语句转换为+=似乎不起作用
谢谢你检查这个
铬:18.0.1025.142米
Firefox:11.0
IE:8.0.7600.16385第一次观察:添加
保存上一个元素集。尝试rowsToChange=jQuery.merge(rowsToChange,[$this])代码>取而代之
第二个观察:似乎rowsToChange
最终将成为与您在上调用的$.makeArray
完全相同的元素集。为什么不直接保存原始集合?如果使用for
循环,则DCoder将显示如何适当地将信息合并在一起。但是,如果您来到这里并使用.each()
循环,请使用以下内容
主要区别在于括号是不必要的/必要的,这取决于'this'
的结构。人们似乎也普遍认为,.each()
至少比原生javascriptfor
循环稍微慢一点。()()
感谢所有看过这个问题、花时间回答、投票支持它的人 什么是“超级链接”?您没有显示您对“rowsToChange”的具体操作。.add()
方法绝对不是串联字符串。DOM不是字符串。你可能想看一看“感谢尖尖”;在我的真实代码中,我抽象了这个方法,产生了一个新名称;超级链接被赋予一个占位符。抱歉弄糊涂了谢谢“我不是”;我目前正在实施DCoder建议的解决方案。与add()相比,它看起来会成功,而且速度非常快;太棒了!我没有包括我所有的代码,以免分散注意力;要添加到rowsToChange中,必须有许多条件:-)我正在尝试您的合并想法!DCoder——非常棒的建议,您的第一个观察结果似乎就是我需要的解决方案;它的运行速度快得令人难以置信,所以我将进行三次检查,但很可能会返回并接受您的答案。非常感谢你!(顺便说一句,merge要求我把[]放在$this附近)D命令:我已经接受了你的答案并实施了它;多么棒的解决方案!这正是我想要的,而且在所有三种浏览器中都非常快。然而,我提到的关于需要在[$this]周围加括号的内容发生了变化。显然,当我使用$.each()循环时,括号是不必要的(正如您所怀疑的),当我使用for循环时,括号是必要的。我会在一个新的答案中提到这两个问题,但请接受你的答案。非常感谢你!
[<div style="display:none" id="stackLocatorLinkFillUp1">itemType=BOUND&ccLocale=PERIODICAL</div>,
<div style="display:none" id="stackLocatorLinkFillUp2">itemType=BOUND&ccLocale=PERIODICAL</div>,
...
]
var superlink = "...new <a> goodness to display for all elements...";
rowsToChange.html(superlink).css("display","block");
var $this, rowsToChange = $([]);
// slower than a for loop
$("[id^=stackLocatorLinkFillUp]:gt("+(uniqueID-1)+")").each( function() {
// If statements <removed> that decide whether or not to include in the new container
$this = $(this); // probably unnecessary under most situations
rowsToChange = jQuery.merge(rowsToChange, $this);
});
rowsToChange.html("...");