$.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/
解决方法
.add()
返回一个新的jQuery对象.更改此行:
result.add(ar[i].elmt);
到这个:
result = result.add(ar[i].elmt);
这仍然不行
@H_502_24@As of jQuery 1.4 the results from .add() will always be returned in document order (rather than a simple concatenation).
所以你只需使用一个香草JS数组,将()排序的元素推入它,然后$()整个事情.
其他代码清理:
$.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);