Не удается получить javascript / jquery для правильной сортировки элементов более одного раза - PullRequest
0 голосов
/ 27 мая 2011

У меня есть дочерние элементы 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 change.

Вот и все, на случай, если я сделаю что-нибудь глупое в другом месте:

$('#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);
});

И ссылка на страницу вопроса

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Вот jsFiddle с этой работой, использующей .detach() вместо .empty() для хранения данных.

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

1 голос
/ 27 мая 2011

Спасибо за ссылку на сайт, который ясно дал понять.

Мне кажется, вы никогда не удаляете данные предыдущего времени. Вы скрываете все, но, возможно, что-то подобное решит вашу проблему (здесь я установил все скрытое снизу, вы можете очистить его или использовать другое значение - если оно не совпадает с любым ключом сортировки):

 $('#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()

0 голосов
/ 27 мая 2011

В конце концов, я понял, что значения данных из скрытых div'ов были связаны с моей сортировкой, поэтому я изменил свой код сортировки так, чтобы он обращал внимание только на: видимые div-ы, и это помогло. Doh! Спасибо за вашу помощь всем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...