1

我知道如何使用 add()将两个 jQueries 添加在一起

但是,对于我正在从事的项目,它已成为性能瓶颈。我摆弄了一下,想出了一个替代方案,这给了我相同的结果,但性能得到了很大的提升(~60ms,而这个小提琴中的 1000ms):

http://jsfiddle.net/jedierikb/rkAP4/1/

var t = $("#test");
var tKids = t.children( );
var j = $("#jest");
var jKids = j.children( );

var z,
    zMax = 30000;

var time1 = new Date();
for (z=0; z<zMax; z++)
{
    var opt1 = tKids.add( jKids );
}
var time2 = new Date();

for (z=0; z<zMax; z++)
{
    var i,
        iMax,
        allKids = [];
    for(i = 0, iMax = tKids.length; i < iMax; i++)
    {
        allKids.push( tKids[i] );
    }
    for(i = 0, iMax = jKids.length; i < iMax; i++)
    {
        allKids.push( jKids[i] );
    }
    var opt2 = $( allKids );
}
var time3 = new Date();

console.log( (time2-time1) + " v " + (time3-time2) );​

注意:我不需要 add 的好处,例如保证 dom 元素排序和删除重复项。

我想知道是否有一种方法可以使这种方法比我正在做的所有迭代更干净或更紧凑。或者也许有更好的方法。

4

2 回答 2

2

我知道您可能出于性能原因试图远离 jQuery API 方法,但这值得一试:

var t = $('#test').children();
var j = $('#jest').children();
var added = t.get().concat(j.get());

我不确定有多快.get(),但我很难想象它比迭代每组孩子要慢。可以做一个jsperf测试...

编辑

为了后代:http ://api.jquery.com/get/

.get()方法允许我们访问每个 jQuery 对象下的 DOM 节点。

于 2012-10-23T14:18:07.877 回答
0

如果允许混合“孩子”的顺序,您可以减少一些循环

for (z=0; z<zMax; z++)
    {
        var tLen = tKids.length;
        var jLen = jKids.length;
        var maxLen = Math.max(tLen, jLen);
        var allKids = [];
        for(var i = 0; i < maxLen; i++)
        {
            if (i<tLen) allKids.push(tKids[i]);
            if (i<jLen) allKids.push(jKids[i]);
        }
        var opt2 = $( allKids );
    }​
于 2012-10-23T14:28:22.940 回答