从单独的jQuery对象创建jQuery对象集合

时间:2011-04-22 15:45:58

标签: jquery

$.fn.sortByDepth = function() {
    var ar = [];
    var result = $([]);

    $(this).each(function() {
        ar.push({length: $(this).parents().length, elmt: $(this)});
    });
    ar.sort(function(a,b) {
        return b.length - a.length;
    });
    for (var i=0; i<ar.length; i++) {
        result.add(ar[i].elmt);
    };
    alert(result.length);
    return result;
};

在这个函数中,我尝试从单独的jQuery对象创建一个jQuery集合。我怎么能这样做?

以下代码不起作用:

result.add(ar[i].elmt);

jsfiddle:http://jsfiddle.net/hze3M/14/

2 个答案:

答案 0 :(得分:17)

.add()返回一个新的jQuery对象。改变这一行:

result.add(ar[i].elmt);

到此:

result = result.add(ar[i].elmt);

虽然

,但仍无效
  

从jQuery 1.4开始,.add()的结果将始终按文档顺序返回(而不是简单的连接)。

所以你只需要使用一个vanilla JS数组,push()将已排序的元素放入其中,然后使用$()整个事物。


其他代码清理:

$.fn.sortByDepth = function() {
    var ar = this.map(function() {
            return {length: $(this).parents().length, elt: this}
        }).get(),
        result = [],
        i = ar.length;


    ar.sort(function(a, b) {
        return a.length - b.length;
    });

    while (i--) {
        result.push(ar[i].elt);
    }
    return $(result);
};


var x = $('input').sortByDepth().map(function() {
    return this.id;
}).get().join(' - ');

$('#selection').text(x);

http://jsfiddle.net/mattball/AqUQH/

答案 1 :(得分:4)

.add返回一个新对象,但不会修改旧对象。

尝试更改:

result.add(ar[i].elmt);

要:

result = result.add(ar[i].elmt);

此外,$([])是不需要的,您可以var result = $();