Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Сортировка элементов списка тупым способом (https://javascript.ru/forum/events/4420-sortirovka-ehlementov-spiska-tupym-sposobom.html)

ururu 20.07.2009 16:45

Сортировка элементов списка тупым способом
 
Есть маркированный список. Требуется его отсортировать по алфавиту по клику. Пытаюсь делать это вот так:

<html>
    <head>
        <title>О лосях</title>
<script>
function go() {
        var ul = document.getElementsByTagName('ul')[0];
	var odin=ul.firstChild;
	var sort=true;
	while (sort==true) do
	{sort=false;
	for (var elem=odin;elem!=null;elem=elem.nextSubling)
 	 {sledElem=elem.nextSubling;
	  if (sledElem!=null) 
	    {var buf1=sledElem.data.slice(1,11);
	     var buf2=elem.data.slice(1,11);
	     if (buf2.localeCompare(buf1)=true)
		{var pervElem=ul.removeChild(sledElem);
		 elem.insertBefore(pervElem);
		  sort=true;}
	    }
 	 }
	}

}
window.onload = function() { document.body.onclick = go }
</script>

    </head>
    <body>
        Правда о лосях.
        <ul>
            <li>
                Лось - животное хитрое
             </li>
		<li>
		яяяяя
		</li>
            <li>
                И коварное
            </li>
        </ul>
    </body>
</html>


Не работает. В чём ошибка? Я, может, и сам дошёл бы, но это моя первая прога на JavaScript, а компилятора, который мог бы ткнуть меня носом в ошибку, нету... На алгоритм просьба не смотреть, это мой личный тупой алгоритм сортировки. :)

Riim 20.07.2009 17:21

<html>
    <head>
        <title>О лосях</title>
<script type="text/javascript">
var $A = function(iterable) {
	if (iterable) {
		var result = [], i = iterable.length;
		while (i) result[--i] = iterable[i];
		return result;
	}
	return [];
};

function go() {
	var ul = document.getElementsByTagName('ul')[0],
		lis = $A(ul.getElementsByTagName('li'));
	lis.sort(function(a, b) {
		a = a.innerHTML.toLowerCase();
		b = b.innerHTML.toLowerCase();
		return a < b ? -1 : a > b ? 1 : 0;
	});
	for (var i = 0, length = lis.length; i < length; i++) ul.appendChild(lis[i]);
}
window.onload = function() {
	document.body.onclick = go;
};
</script>
 
    </head>
    <body>
        Правда о лосях.
        <ul>
            <li>
                Лось - животное хитрое
             </li>
        <li>
        яяяяя
        </li>
            <li>
                И коварное
            </li>
        </ul>
    </body>
</html>

Ururu 21.07.2009 08:11

Спасибо! :) Я даже почти понял, как это работает. Единственное, чего я так и не понял:
перед тем, как мы начинаем сортировку, у нас уже есть элементы списка. После сортировки мы добавляем ещё элементы командой append. Старые при этом нигде не удаляются! Куда же они деваются?

Ururu 21.07.2009 09:10

Как оказалось, это не единственное, что я не понял. :)
Мне надо, чтобы сортировка была при загрузке, то есть, чтобы пользователь сразу видел уже отсортированный список. Пытаюсь делать так:

window.onload = function {go();}


Не работает. Так пробую:

window.onload = go


Тоже ноль внимания. Подскажите уж ламеру...

Riim 21.07.2009 09:35

Цитата:

Сообщение от Ururu
После сортировки мы добавляем ещё элементы командой append. Старые при этом нигде не удаляются! Куда же они деваются?

А что где-то есть новые?

Цитата:

Сообщение от Ururu
Куда же они деваются?

При добавлении элемента в новое место он автоматически удаляется со старого.

Цитата:

Сообщение от Ururu
Не работает. Так пробую:

Цитата:

Сообщение от Ururu
Тоже ноль внимания.

У меня все работает.

Ururu 21.07.2009 09:46

За пояснения по элементам списка спасибо.
А какой вариант у Вас работает? Или оба? и как именно работает? Я, наверно, неверно выразился. Список-то у меня выводится, но не отсортированный по алфавиту.

Riim 21.07.2009 11:28

Цитата:

Сообщение от Ururu
Список-то у меня выводится, но не отсортированный по алфавиту.

я так и понял.

Цитата:

Сообщение от Ururu
А какой вариант у Вас работает? Или оба?

оба.

Попробуй ";" правильно расставить.

Ururu 21.07.2009 11:39

Действительно, удаляя

window.onload = function() {
    document.body.onclick = go;
};


не заметил и оставил конечные "};". Убил их и всё заработало! :dance:

Спасибо за помощь! Тема закрыта.

x-yuri 21.07.2009 16:44

на сервере это лучше делать

Цитата:

Сообщение от Ururu
Мне надо, чтобы сортировка была при загрузке, то есть, чтобы пользователь сразу видел уже отсортированный список

можно либо поставить этому списку visibility: hidden, а после сортировки изменить на visible. Либо создавать этот список с помощью javascript и вставлять в DOM

anikey99 11.01.2010 01:41

может кому эта тема будет актуальна, есть способ сортировки попроще :)
-----------------------------------
<a onclick=sorrta()>Sort_АЯ</a> | <a onclick=sorrtz()>Sort_ЯА</a><br>
<ul>
<li>Вася
<li>Петя
<li>Аня
<li>Юра
</ul>  

<script>
var myar= new Array();
var li1=document.getElementsByTagName('li');

function sorrta() {

for(var li2=0;li2<li1.length;li2++) {
myar[li2]=li1[li2].innerHTML;
}
myar.sort();
for(var li3=0;li3<myar.length;li3++) {
li1[li3].innerHTML=myar[li3];

}
}

function sorrtz() {

for(var li2=0;li2<li1.length;li2++) {
myar[li2]=li1[li2].innerHTML;
}
myar.sort();
myar.reverse();
for(var li3=0;li3<myar.length;li3++) {
li1[li3].innerHTML=myar[li3];
}
}
</script>

--------------------
рабочий пример: http://kachay.ucoz.org/load/27-1-0-185


Часовой пояс GMT +3, время: 05:13.