Сортировка таблицы html. Обеспечение совместимости с FF. Описание класса Column
Месяц у меня вылеживалась эта дура на 10 листов. Нашла, подправила. Пусть будет...
Попробую описать реализацию своего класса для динамической сортировки строк таблицы в JavaScript. "Ни пуха" мне...
План таков: Постановка задачиМаксимально универсальная функция должна:
- Легко подключаться, не зависеть от дизайна, никакого JS-кода не должно быть в объявлении таблицы.
- Корректно работать для строковых и числовых значений.
- Корректно обрабатывать теги внутри ячеек таблицы.
- Автоматически менять вид заголовка столбца в зависимости от направления сортировки.
- Корректно работать во всех распространенных браузерах. В моем понимании это IE, Opera и FF. В других теоретически тоже должно работать.
Из множества алгоритмов сортировки здесь выбираем самый простой. Суть такова: находим наименьший (или наибольший - в зависимости от порядка сортировки) элемент массива, меняем его местами с первым элементом. Далее находим второй наименьший (или наибольший), и меняем его со вторым. Ну и так далее.
Для наглядности привожу классическую реализацию алгоритма сортировки массива по возрастанию:
var arr = new Array(4, 5, 1, 3, 2);
for (var i=0; i= 1046 && tmp < 1078)
tmp++;
else if(tmp == 1025)
tmp = 1046;
else if(tmp >= 1078)
tmp++;
else if(tmp == 1105)
tmp = 1078;
retArray[ i ] = tmp;
}
return retArray;
}
function fillArray(years, books, authors) {
authors = upCs(authors, " ");
authors = upCs(authors, "-");
books = upCs(books, "");
this.years = years;
this.yweight = weight(years);
this.books = books;
this.bweight = weight(books);
this.authors = authors;
this.aweight = weight(authors);
}
function isLow(low, high, type) {
var len1 = low[ type ].length;
var len2 = high[ type ].length;
var length = len1 < len2 ? len1: len2;
for(var i = 0; i < length; i++) {
var str1 = low[ type ][ i ];
var str2 = high[ type ][ i ];
if(str1 < str2)
return true;
if(str1 > str2)
return false;
}
if(len1 < len2)
return true;
return false;
}
function quickSort(l, h, type) {
var low = l;
var high = h;
var rt = eval("txt[ " + Math.round((l + h) / 2) + " ]");
var middle = new fillArray(rt.years, rt.books, rt.authors);
do {
while(isLow(eval("txt[ " + low + " ]"), middle, type))
low++;
while(isLow(middle, eval("txt[ " + high + " ]"), type))
high--;
if(low