我的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/
不工作?
答案 0 :(得分:72)
您可以使用存储元素的所有自定义dataset
属性的data-*
属性,它返回一个字符串,以防您想要将字符串转换为可以使用的数字{{ 1}}或parseInt
运算符。
+
是的,您的代码可以在这里工作,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>