Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.07.2009, 15:45
ururu
 
Сообщений: n/a

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

<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, а компилятора, который мог бы ткнуть меня носом в ошибку, нету... На алгоритм просьба не смотреть, это мой личный тупой алгоритм сортировки.
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2009, 16:21
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

<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>

Последний раз редактировалось Riim, 20.07.2009 в 16:24.
Ответить с цитированием
  #3 (permalink)  
Старый 21.07.2009, 07:11
Ururu
 
Сообщений: n/a

Спасибо! Я даже почти понял, как это работает. Единственное, чего я так и не понял:
перед тем, как мы начинаем сортировку, у нас уже есть элементы списка. После сортировки мы добавляем ещё элементы командой append. Старые при этом нигде не удаляются! Куда же они деваются?
Ответить с цитированием
  #4 (permalink)  
Старый 21.07.2009, 08:10
Ururu
 
Сообщений: n/a

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

window.onload = function {go();}


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

window.onload = go


Тоже ноль внимания. Подскажите уж ламеру...
Ответить с цитированием
  #5 (permalink)  
Старый 21.07.2009, 08:35
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

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

Сообщение от Ururu
Куда же они деваются?
При добавлении элемента в новое место он автоматически удаляется со старого.

Сообщение от Ururu
Не работает. Так пробую:
Сообщение от Ururu
Тоже ноль внимания.
У меня все работает.
Ответить с цитированием
  #6 (permalink)  
Старый 21.07.2009, 08:46
Ururu
 
Сообщений: n/a

За пояснения по элементам списка спасибо.
А какой вариант у Вас работает? Или оба? и как именно работает? Я, наверно, неверно выразился. Список-то у меня выводится, но не отсортированный по алфавиту.
Ответить с цитированием
  #7 (permalink)  
Старый 21.07.2009, 10:28
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

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

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

Попробуй ";" правильно расставить.
Ответить с цитированием
  #8 (permalink)  
Старый 21.07.2009, 10:39
Ururu
 
Сообщений: n/a

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

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


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

Спасибо за помощь! Тема закрыта.
Ответить с цитированием
  #9 (permalink)  
Старый 21.07.2009, 15:44
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

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

Сообщение от Ururu
Мне надо, чтобы сортировка была при загрузке, то есть, чтобы пользователь сразу видел уже отсортированный список
можно либо поставить этому списку visibility: hidden, а после сортировки изменить на visible. Либо создавать этот список с помощью javascript и вставлять в DOM
Ответить с цитированием
  #10 (permalink)  
Старый 11.01.2010, 00:41
Интересующийся
Отправить личное сообщение для anikey99 Посмотреть профиль Найти все сообщения от anikey99
 
Регистрация: 27.03.2009
Сообщений: 18

может кому эта тема будет актуальна, есть способ сортировки попроще
-----------------------------------
<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
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выбор элементов и построение списка выбранных элементов. madgals Events/DOM/Window 6 14.04.2009 21:30
Блок выбора элементов из списка. Аля joblist Acrossfy Элементы интерфейса 3 25.03.2009 23:49