无法获得javascript / jquery多次正确排序元素

时间:2011-05-26 21:03:38

标签: javascript jquery sorting

我有子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);
});

And a link to the page in question

3 个答案:

答案 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()来保存数据。

http://jsfiddle.net/shaneblake/Tn9u8/

答案 2 :(得分:0)

最终弄清楚了,隐藏div的数据值与我的排序紧密相关,所以我改变了我的排序代码,只关注:可见的divs,这就是诀窍。卫生署!谢谢大家的帮助。