$.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/
答案 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);
答案 1 :(得分:4)
.add
返回一个新对象,但不会修改旧对象。
尝试更改:
result.add(ar[i].elmt);
要:
result = result.add(ar[i].elmt);
此外,$([])
是不需要的,您可以var result = $();