jQuery使用数据id排序元素

时间:2012-11-21 09:46:16

标签: javascript jquery html sorting

我的HTML结构如下:

<div class="clist">
    <div data-sid=1></div>
    <div data-sid=2></div>
    <div data-sid=2></div>
    <div data-sid=1></div>
    <div data-sid=2></div>
    <div data-sid=2></div>
    <div data-sid=1></div>
</div>

我想将它们排序为:

<div class="clist">
    <div data-sid=1></div>
    <div data-sid=1></div>
    <div data-sid=1></div>
    <div data-sid=2></div>
    <div data-sid=2></div>
    <div data-sid=2></div>
    <div data-sid=2></div>
</div>

我正在使用以下功能:

function sortContacts() {
    var contacts = $('div.clist'), cont = contacts.children('div');

    cont.detach().sort(function(a, b) {
        var astts = $(a).data('sid');
        var bstts = $(b).data('sid')
        return (astts > bstts) ? (astts > bstts) ? 1 : 0 : -1;
    });

    contacts.append(cont);
}

它没有按预期工作。

第一次运行效果很好,但在添加新元素或更改data-sid属性后,它不再有效。

演示:http://jsfiddle.net/f5mC9/1/

不工作?

4 个答案:

答案 0 :(得分:72)

您可以使用存储元素的所有自定义dataset属性的data-*属性,它返回一个字符串,以防您想要将字符串转换为可以使用的数字{{ 1}}或parseInt运算符。

+

http://jsfiddle.net/CFYnE/

是的,您的代码可以在这里工作,http://jsfiddle.net/f5mC9/

编辑:请注意IE10!以下不支持$('.clist div').sort(function(a,b) { return a.dataset.sid > b.dataset.sid; }).appendTo('.clist'); 属性,如果你想支持所有浏览器,你可以使用jQuery的.dataset方法:

.data()

答案 1 :(得分:8)

$('.clist div').sort(function(a,b) {
     return a.dataset.sid > b.dataset.sid ? 1 : -1; //be carefull, string comparaison
}).appendTo('.clist');

或者

$('.clist div').sort(function(a,b) {
     return parseInt(a.dataset.sid) - parseInt(b.dataset.sid);
}).appendTo('.clist');

sort()处理负/正回报;

答案 2 :(得分:6)

使用jQuery对元素进行排序的更通用的函数:

$.fn.sortChildren = function (sortingFunction: any) {

    return this.each(function () {
        const children = $(this).children().get();
        children.sort(sortingFunction);
        $(this).append(children);
    });

};

用法:

$(".clist").sortChildren((a, b) => a.dataset.sid > b.dataset.sid ? 1 : -1);

答案 3 :(得分:0)

function orderSteps() {
    var steps = $('div.steps'),
        cont = steps.children('div.step');
    cont.detach().sort(function (a, b) {
        var astts = a;
        var bstts = b;

        // stripping the id to get the position number
        var classArrA = $(astts).attr("id").split("-")[1];
        var classArrB = $(bstts).attr("id").split("-")[1];

        // checking for the greater position and order accordingly
        if (parseInt(classArrA) > parseInt(classArrB)) {
            return (0)
        }
        else {
            return (-1)
        }
    })
    steps.append(cont);
};

orderSteps()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container-fluid steps">
            <div class="row text-center border-bottom step" id="step-1">
                <span class="col-3">Item 1</span>
            </div>
            <div class="row text-center border-bottom step" id="step-2">
                <span class="col-3">Item 2</span>
            </div>
            <div class="row text-center border-bottom step" id="step-30">
                <span class="col-3">Item 3</span>
            </div>
            <div class="row text-center border-bottom step" id="step-4">
                <span class="col-3">Item 4</span>
            </div>
        </div>