Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery:add()性能;有更好的办法吗?_Javascript_Jquery_Arrays_Performance_Add - Fatal编程技术网

Javascript jQuery:add()性能;有更好的办法吗?

Javascript jQuery:add()性能;有更好的办法吗?,javascript,jquery,arrays,performance,add,Javascript,Jquery,Arrays,Performance,Add,我想做的是:将页面上所有类似的元素(某种类型)组合到一个对象中,我可以稍后对其进行迭代,或者对其中的每个元素应用彻底的更改 我的代码成功地完成了给定的任务,但当元素数量增加到200-300+时,性能会急剧下降,用户已经注意到了。我已经分离出了有问题的代码行,想知道是否有其他方法可以解决同样的问题 add()函数似乎是一个有问题的操作,它基于我在其周围放置的计时器。开始时,执行该操作所需的时间为.001,但会不断增加,直到元素数达到300,并且每增加一个元素需要大约.1秒的时间,并且会继续减慢 我

我想做的是:将页面上所有类似的元素(某种类型)组合到一个对象中,我可以稍后对其进行迭代,或者对其中的每个元素应用彻底的更改

我的代码成功地完成了给定的任务,但当元素数量增加到200-300+时,性能会急剧下降,用户已经注意到了。我已经分离出了有问题的代码行,想知道是否有其他方法可以解决同样的问题

add()函数似乎是一个有问题的操作,它基于我在其周围放置的计时器。开始时,执行该操作所需的时间为.001,但会不断增加,直到元素数达到300,并且每增加一个元素需要大约.1秒的时间,并且会继续减慢

我有()的jQuery性能增强功能,并实现了其中的一些功能(即3),但它们没有给我任何有意义的性能提升。令人惊讶的是,对于Firefox(300多次调用add())来说,这段代码只需1秒(!),而Chrome和IE大约需要10-20倍或更长的时间

这是我的密码:

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()
至少比原生javascript
for
循环稍微慢一点。()()


感谢所有看过这个问题、花时间回答、投票支持它的人

什么是“超级链接”?您没有显示您对“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&amp;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("...");