Can';无法让javascript/jquery多次正确排序元素

Can';无法让javascript/jquery多次正确排序元素,javascript,jquery,sorting,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().app

我有一些子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);
});
$('#律师过滤器')。更改(函数(){
//获取用于排序的链接数组
var myArray=$('#attorneyBlocks div').get();
var selectedrea=$(this.val();
//选择“全部”时按字母顺序排序
如果(selectedArea==“全部”){
$(#律师组”).show();
排序(函数(a,b){
返回$(a).text()>$(b).text()?1:-1;
});
//根据实践区域筛选律师,然后将其顺序#分配给具有数据的div,从div的类中获取所有值
}否则{
$('#attorneyBlocks div').hide().each(function()){
var attorneyArea=$(this.attr('class').split(',');

对于(var i=0;i

感谢您提供了指向该站点的链接,这一点很清楚

在我看来,您从未清除以前的数据。您隐藏了所有内容,但这样做可能会解决您的问题(在这里,我将所有内容都隐藏在底部,您可以清除它或使用其他值,只要它与任何排序键不同):



问题是更改事件绑定到原始项。排序后,您创建所有新项。它们没有任何事件绑定到它们。您需要使用
.live()

以下是一个JSFIDLE,它使用
.detach()
而不是
.empty()
来保留数据


最终发现,隐藏div的数据值影响了我的排序,所以我将排序代码改为只关注可见div,这就成功了。Doh!谢谢大家的帮助。

知道是什么导致div出现故障可能会有所帮助,以便此代码需要再次运行……嘿,Hogan,谢谢答案是,但是更改事件只是在页面上其他地方的下拉列表中,它实际上从未受到此代码的影响,所以使用.live()没什么区别。试一试,下面是我在JSFIDLE上创建的一些更新代码,以及您的代码示例,将下拉列表更改为business&tax,前两个名字是David Herzer和David Batista,这与列表中的其他名字一样正确。将其更改为family law,然后返回business org&tax,我们有一个完全不同的租金排序列表。我不明白,啊!我开始使用控制台日志来获取每个div的数据('顺序')值在这里顺序值保持正确,因此我的部分代码是正确的。我找不到模式,数字到处都是,有时它们在足够的跳跃后返回到正确的顺序。最终发现,来自隐藏div的数据值影响了我的排序,所以我将排序代码改为o只需注意:可见div,这就成功了。Doh!谢谢大家的帮助。@joren-是的,我发现了,就像你做的一样(见我的答案),你也解决了myArray的问题吗?如果你在选择其他内容后选择all,你就可以看到问题。
 $('#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();