Подтвердить что ты не робот

Элементы сортировки jQuery с использованием идентификатора данных

(извините, если вопрос уже существует)

Я очень новичок в разработке jQuery.

У меня есть структура 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;
            return (astts > bstts) ? (astts > bstts) ? 1 : 0 : -1;
        });

contacts.append(cont);
}

Но он работает не так, как ожидалось.

Он работает хорошо в первый раз, но при добавлении нового элемента или изменении файла данных он не работает.

EDIT:

Демонстрационный

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

не работает?

4b9b3361

Ответ 1

Вы можете использовать свойство dataset, в котором хранятся все пользовательские атрибуты data-* элемента, он возвращает строку, в случае, если вы хотите преобразовать строку в число, которое вы можете использовать parseInt или +.

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

http://jsfiddle.net/CFYnE/

И да, ваш код работает здесь, http://jsfiddle.net/f5mC9/

Изменить: Обратите внимание, что IE10! и ниже не поддерживают свойство .dataset, если вы хотите поддерживать все браузеры, вы можете вместо этого использовать метод jQuery .data():

$('.clist div').sort(function(a,b) {
     return $(a).data('sid') > $(b).data('sid');
}).appendTo('.clist');

Ответ 2

$('.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() обрабатывает отрицательные/положительные значения,

Ответ 3

Более общая функция для сортировки элементов с помощью 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);