jQuery遍历顺序 - 深度优先

Kee*_*ker 2 html javascript jquery dom

我有一堆嵌套的复选框.我想选择所有复选框,并在该集合中首先使用"最深"元素.考虑以下html:

<div id="selection"></div>
<div>
    <label>A: <input id="a" type="checkbox" /></label><br/>
    <div>
        <label>B: <input id="b" type="checkbox" /></label><br/>
        <label>C: <input id="c" type="checkbox" /></label><br/>
    </div>
    <label>D: <input id="d" type="checkbox" /></label><br/>
    <label>E: <input id="e" type="checkbox" /></label><br/>
    <div>
        <label>F: <input id="f" type="checkbox" /></label><br/>
        <label>G: <input id="g" type="checkbox" /></label><br/>
        <div>
            <label>H: <input id="h" type="checkbox" /></label><br/>
            <label>I: <input id="i" type="checkbox" /></label><br/> 
        </div>
    </div>
    <label>J: <input id="j" type="checkbox" /></label><br/>
</div>
Run Code Online (Sandbox Code Playgroud)

我正在使用一些jQuery来打印选择顺序:

var x = '';

$('input').each(function(){
    x += $(this).attr('id') + ' - ';
});

$('#selection').text(x.substr(0, x.length - 3)); 
Run Code Online (Sandbox Code Playgroud)

结果是:a - b - c - d - e - f - g - h - i - j.

我希望订单或所选元素是I, H, G, F, C, B, J, E, D, AH, I, B, C, F, G, A, D, E, J.如何重新排序选择以与我想要的兼容?或者他们是按照我想要的方式进行初始选择的方法吗?

喔...并为你们所有的小提琴手:http://jsfiddle.net/hze3M/4/!发疯!:d

ale*_*exl 5

var x = '';
var ar = [];
$('input').each(function(){
    ar.push({length: $(this).parents().length, elmt: $(this)});
});

ar.sort(function(a,b) {
    if (a.length - b.length > 0) {
        return -1;
    }

    if (a.length - b.length < 0) {
        return 1;
    }

    return 0;
});

for (var i=0; i<ar.length; i++) {
    x += (ar[i].elmt.attr("id")) + ' - ';
};    

$('#selection').text(x);
Run Code Online (Sandbox Code Playgroud)

Jsfiddle:http://jsfiddle.net/hze3M/7/

编辑:

这里是另一个解

$.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);
Run Code Online (Sandbox Code Playgroud)

这里的功劳:从单独的jQuery对象创建一个jQuery对象集合