Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Сортировка DIV на "чистом" JavaScript (https://javascript.ru/forum/dom-window/58876-sortirovka-div-na-chistom-javascript.html)

Feuerman063 15.10.2015 10:33

Сортировка DIV на "чистом" JavaScript
 
Доброго времени суток. Возникла задача сортировки DOM объекта со следующей структурой:
<div id="search">
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Заголовок 1</a></div>
	</div>
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Заголовок 2</a></div>
	</div>
	....
</div>


Нужна сортировка блоков '.search-element' по заголовкам внутри ссылок. И решение хотелось бы видеть на "чистом" JS. Подскажите, пожалуйста, куда мне копать.

ksa 15.10.2015 10:36

Цитата:

Сообщение от Feuerman063
Подскажите, пожалуйста, куда мне копать

Нужно уметь:
- брать нужный элемент
- брать нужный текст из элемента
- уметь пользоваться оператором
if (){}

- вставлять элемент до или после какого-то элемента

Feuerman063 15.10.2015 11:18

Цитата:

Сообщение от ksa (Сообщение 392027)
Нужно уметь:
- брать нужный элемент
- брать нужный текст из элемента
- уметь пользоваться оператором
if (){}

- вставлять элемент до или после какого-то элемента

var arr = document.getElementById('search');
var arr_element = arr.getElementsByClassName('search-element');
var sort_str = arr_element[0].getElementsByTagName('div').item(1).textContent);

Ну вот так мы выбираем содержимое, по которому нужно сортировать, правильно понимаю (у меня в переменной для первого элемента содержимое указано для примера) ? А как дальше сортировать по этому содержимому и записать это все в DOM?
С операторами я знаком, только вот не могу алгоритм понять такой сортировки

ksa 15.10.2015 11:29

Цитата:

Сообщение от Feuerman063
var arr = document.getElementById('search');
var arr_element = arr.getElementsByClassName('element');
var sort_str = arr_element[0].getElementsByTagName('div').item(1).textContent);


Ну вот так мы выбираем содержимое, по которому нужно сортировать

Довольно мудрено, надо сказать... :)
Цитата:

Сообщение от Feuerman063
А как дальше сортировать по этому содержимому и записать это все в DOM?

Это зависит от метода сортировки...
Цитата:

Сообщение от Feuerman063
вот не могу алгоритм понять такой сортировки

Алгоритмов сортировки достаточно много
https://ru.wikipedia.org/wiki/Алгоритм_сортировки

ksa 15.10.2015 11:34

Пример "взятия" текста

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
</script>
</head>
<body>
<div id="search">
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Заголовок 1</a></div>
	</div>
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Заголовок 2</a></div>
	</div>
	....
</div>
<script type='text/javascript'>
var o=document.querySelectorAll('#search > .search-element > div:last-child > a');
for (var i=0; i<o.length; i++) {
	alert(o[i].innerHTML);
};
</script>
</body>
</html>

laimas 15.10.2015 11:35

Элементы "search-element" это массив элементов "search", то есть хранятся под индексами от 0 до n. Под этими же индексами хранятся и заголовки. Если взять индексы заголовка как свойства объектов, а заголовки их значения, то после сортировки этого объекта его свойства будут указывать индексы элементов "search-element" по которым их нужно выстроить в "search".

Feuerman063 15.10.2015 11:42

Цитата:

Сообщение от laimas (Сообщение 392040)
Элементы "search-element" это массив элементов "search", то есть хранятся под индексами от 0 до n. Под этими же индексами хранятся и заголовки. Если взять индексы заголовка как свойства объектов, а заголовки их значения, то после сортировки этого объекта его свойства будут указывать индексы элементов "search-element" по которым их нужно выстроить в "search".

Спасибо, буду пробовать.

laimas 15.10.2015 11:44

Пробуйте, только вопрос - если это разовая сортировка и если это результат вывода сервера данных полученных из базы, то почему эти данные сразу не отсортированы запросом?

Feuerman063 15.10.2015 11:49

Цитата:

Сообщение от laimas (Сообщение 392043)
Пробуйте, только вопрос - если это разовая сортировка и если это результат вывода сервера данных полученных из базы, то почему эти данные сразу не отсортированы запросом?

Это результаты поиска, полученные через YouTube Api, а именно список видео по конкретному запросу. После вывода этих данных необходимо добавить возможность отсортировать полученные результаты по имени.

laimas 15.10.2015 11:52

API этот html-код и выдает или же JSON, по которому вы сами его строите?

Feuerman063 15.10.2015 11:53

Выдает JSON

laimas 15.10.2015 12:03

А если JSON, то нужно сначала его сортировать, и только затем выводить, это менее затратно, чем потом копаться в DOM. К тому же почитать об API, возможно что его запросы позволяют указывать параметры сортировки и возвращать уже отсортированное.

Feuerman063 15.10.2015 12:16

Понял, спасибо за советы. Почитаю еще об API.

рони 15.10.2015 12:27

сортировка div по содержимому js
 
Feuerman063,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">

</head>

<body>
<div id="search">
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Вася</a></div>
	</div>
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Аня</a></div>
	</div>
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Вова</a></div>
	</div>
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Боря</a></div>
	</div>
</div>
<script type='text/javascript'>
var c = document.querySelector("#search");
Array.apply(null,c.querySelectorAll(".search-element"))
.sort(function(a, b) {
    a = a.querySelector("div:last-child > a").text;
    b = b.querySelector("div:last-child > a").text;
    return a < b ? -1 : a > b ? 1 : 0
})
.forEach(function(a) {
    c.appendChild(a)
});
</script>
</body>

</html>

вариант на jQuery тут http://javascript.ru/forum/jquery/39...tml#post259543

Feuerman063 15.10.2015 12:34

Цитата:

Сообщение от рони (Сообщение 392060)

А вам спасибо за рабочий вариант. Эту тему я как раз находил по jQuery.

FINoM 17.10.2015 14:10

рони, а зачем использовать map, если можно заюзать slice?
Цитата:

Сообщение от рони
= a.querySelector("div:last-child > a").text;

Что это за свойство такое? Почему не textContent?

рони 17.10.2015 23:12

Цитата:

Сообщение от FINoM
если можно заюзать slice?

можно :)
Цитата:

Сообщение от FINoM
Что это за свойство такое?

видимая часть ссылки, вроде всегда было :-?

FINoM 17.10.2015 23:14

Цитата:

Сообщение от рони
видимая часть ссылки, вроде всегда было

Работаю вроде давно, но этого не знал. Я бы запутался, честно говоря, не встретив такого свойства в другом элементе.

рони 17.10.2015 23:19

Цитата:

Сообщение от FINoM
Я бы запутался, честно говоря, не встретив такого свойства в другом элементе.

text есть ещё в option или я что-то неправильно понимаю?

FINoM 17.10.2015 23:28

Цитата:

Сообщение от рони
text есть ещё в option или я что-то неправильно понимаю?

Человек запомит, что текст можно извлечь с помощью свойства text, потом будет матюкаться, если его не найдет в диве. Лучше всегда использовать textContent. А такие древние API лучше не трогать.

Вот еще один пример древнего API:

alert('xxxx'.bold());

рони 17.10.2015 23:38

Цитата:

Сообщение от FINoM
Вот еще один пример древнего API:

:victory: спасибо не знал

FINoM 17.10.2015 23:49

Цитата:

Сообщение от рони
спасибо не знал

Таких методов, на самом деле, куча.

рони 19.10.2015 01:44

Цитата:

Сообщение от FINoM
если можно заюзать slice?

можно и так :)
Array.apply(null,c.querySelectorAll(".search-element"))

FINoM 19.10.2015 11:28

Цитата:

Сообщение от рони
можно и так

В IE8 будет ругаться. В идеале, если забить на совместимость, лучше сделать так:
Array.from(c.querySelectorAll('.selector'));

malefikus13 21.10.2015 10:24

Цитата:

Сообщение от рони (Сообщение 392060)
Feuerman063,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">

</head>

<body>
<div id="search">
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Вася</a></div>
	</div>
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Аня</a></div>
	</div>
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Вова</a></div>
	</div>
	<div class="search-element">
		<div><a href="..."><img src="..."></a></div>
		<div><a href="...">Боря</a></div>
	</div>
</div>
<script type='text/javascript'>
var c = document.querySelector("#search");
Array.apply(null,c.querySelectorAll(".search-element"))
.sort(function(a, b) {
    a = a.querySelector("div:last-child > a").text;
    b = b.querySelector("div:last-child > a").text;
    return a < b ? -1 : a > b ? 1 : 0
})
.forEach(function(a) {
    c.appendChild(a)
});
</script>
</body>

</html>

вариант на jQuery тут http://javascript.ru/forum/jquery/39...tml#post259543

Рони, доброго дня! А вот такой вопрос есть...а можно ли сделать так, чтоб сортировка происходила исходя из классов? Т.е. есть два класса ".negativ" и ".pozitiv". Можно ли сделать так, чтоб сначала вывелись все классы ".pozitiv", а лишь после этого все элементы с классом ".negativ"?

рони 21.10.2015 10:48

malefikus13,
да ... минимальный html сделайте

malefikus13 21.10.2015 10:53

Цитата:

Сообщение от рони (Сообщение 392649)
malefikus13,
да ... минимальный html сделайте

К примеру вот так. :) Сначала чтоб вывелись все class="pozitive", а следом class="negative"
<div id="block">
	<div class="negative">
		<div><b>Вася</b></div>
	</div>
	<div class="pozitive">
		<div><b>Аня</b></div>
	</div>
	<div class="pozitive">
		<div><b>Вова</b></div>
	</div>
	<div class="negative">
		<div><b>Боря</b></div>
	</div>
</div>

рони 21.10.2015 11:09

malefikus13,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
   .pozitive{
     background-color: #FF0000;
   }
   .negative{
     background-color: #008000;
   }
   .test{
     background-color: #D2691E;
   }
   a{
     color: #FFFF00;
   }

  </style>
</head>

<body>
<div id="block">
    <div class="test">
		<div><b>Пётр</b></div>
	</div>
	<div class="negative">
		<div><b>Вася</b></div>
	</div>
	<div class="pozitive">
		<div><b>Аня</b></div>
	</div>
	<div class="pozitive">
		<div><b>Вова</b></div>
	</div>
	<div class="negative">
		<div><b>Боря</b></div>
	</div>
</div>

<script type='text/javascript'>
var c = document.querySelector("#block");
Array.apply(null,document.querySelectorAll("#block > div"))
.sort(function(a, b) {
    a = a.classList;
    a = a.contains('pozitive') ? -1 : a.contains('negative') ? 0 : 1;
    b = b.classList;
    b = b.contains('pozitive') ? -1 : b.contains('negative') ? 0 : 1;
    return a < b ? -1 : a > b ? 1 : 0
})
.forEach(function(a) {
    c.appendChild(a)
});
</script>
</body>

</html>

malefikus13 21.10.2015 11:16

рони, спасибо большое! :):thanks:

malefikus13 21.10.2015 11:22

рони,
а не подскажите еще, для общего развития, что по этой теме следует почитать. Очень хочется поглубже данную тему усвоить. Заранее спасибо Вам!

рони 21.10.2015 11:46

malefikus13,
даже незнаю что добавить :)

malefikus13 21.10.2015 13:03

Цитата:

Сообщение от рони (Сообщение 392662)
malefikus13,
даже незнаю что добавить :)

Все равно спасибо! :)


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