我有子div,我正在尝试根据jquery .data()值进行排序,我给它们只是一个数字。这段代码完美无缺,但只有一次,之后我无法弄清楚它是如何排序的。这是一个简化版本:
var myArray = $('#container div').get();
myArray.sort(function(x,y) {
return $(x).data('order') - $(y).data('order');
});
$('#container').empty().append(myArray);
我已经尝试了很多其他不同的排序方法,其他插件等,我无法正常工作。这是我能得到的尽可能接近。我只是在jquery更改事件上运行。
以下是我在其他地方做些蠢事的全部事情:
$('#attorneyFilter').change(function() {
//get array of links for sorting
var myArray = $('#attorneyBlocks div').get();
var selectedArea = $(this).val();
//sort alphabetically when "all" is selected
if (selectedArea == 'all') {
$('#attorneyBlocks div').show();
myArray.sort(function(a,b) {
return $(a).text() > $(b).text() ? 1 : -1;
});
//filter attorneys based on practice area and then assign its order# to the div with data, getting all values from the div's class
} else {
$('#attorneyBlocks div').hide().each(function() {
var attorneyArea = $(this).attr('class').split(', ');
for (var i=0;i<attorneyArea.length;i++) {
var practiceArea = attorneyArea[i].split('-');
if (selectedArea == practiceArea[0]) {
$(this).show().data('order',practiceArea[1]);
}
}
});
//sort based on order, the lower the number the higher it shows up
myArray.sort(function(x,y) {
return $(x).data('order') - $(y).data('order');
});
}
//append order back in
$('#attorneyBlocks').empty().append(myArray);
});
答案 0 :(得分:1)
感谢网站的链接,明确了这一点。
在我看来,你永远不会清除前一次的数据。你隐藏了一切,但也许这样的东西可以解决你的问题(这里我把所有东西隐藏到底部,你可以清除它或使用不同的值 - 只要它与任何排序键不一样):
$('#attorneyBlocks div').hide().data('order',999999).each(function() {
var attorneyArea = $(this).attr('class').split(', ');
for (var i=0;i<attorneyArea.length;i++) {
var practiceArea = attorneyArea[i].split('-');
if (selectedArea == practiceArea[0]) {
$(this).show().data('order',practiceArea[1]);
}
}
});
此外,服务器上的代码缺少您上面的第二行:
var myArray = $('#attorneyBlocks div').get();
问题是更改事件与原始项目相关联。排序后,您将创建所有新项目。他们没有任何与他们有关的事件。您需要使用.live()
答案 1 :(得分:1)
这是一个jsFiddle,使用.detach()
而不是.empty()
来保存数据。
答案 2 :(得分:0)
最终弄清楚了,隐藏div的数据值与我的排序紧密相关,所以我改变了我的排序代码,只关注:可见的divs,这就是诀窍。卫生署!谢谢大家的帮助。