Сортировка по дочерним элементам на JS или JQUERY
Вложений: 1
Здравствуйте!
Долго искал, но так и не нашёл способ справиться с проблемой. Очень рассчитываю на вашу помощь! Скажем есть вот такая страничка:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div class="items" id="inventory_bot">
<div class="item" id="12932097827">
<a class="link-btn" href="https://ХХХ" target="_blank">O</a>
<div class="parse-btn parse-done">
<div class="parseDataPRGREEN">
-32.47
</div>
<div class="parseDataPRRED">
78.16
</div>
<div class="parse-data-price">
108.8$
</div>
</div>
</div>
</div>
<div class="items" id="inventory_bot">
<div class="item" id="12932097827">
<a class="link-btn" href="https://ХХХ" target="_blank">O</a>
<div class="parse-btn parse-done">
<div class="parseDataPRGREEN">
-41.47
</div>
<div class="parseDataPRRED">
49.16
</div>
<div class="parse-data-price">
108.8$
</div>
</div>
</div>
</div>
<div class="items" id="inventory_bot">
<div class="item" id="12932097827">
<a class="link-btn" href="https://ХХХ" target="_blank">O</a>
<div class="parse-btn parse-done">
<div class="parseDataPRGREEN">
-12.47
</div>
<div class="parseDataPRRED">
11.16
</div>
<div class="parse-data-price">
108.8$
</div>
</div>
</div>
</div>
</body>
</html>
Необходимо отсортировать элементы('.item') находящиеся в div c #inventory_bot по возрастанию и убыванию. Но критерием сортировки является дочерний div .parseDataPRGREEN (для сортировки по возрастанию) и div .parseDataPRRED (по убыванию соответственно). Вся сложность для меня как раз в том, что критерий сортировки находится глубоко внутри элемента, что необходимо сортировать. Буду благодарен любой помощи! Заранее огромное спасибо! P.S картинка иллюстрирует вид элементов на странице. Нужно чтоб они отобразились в отсортированном виде |
На первый случай) Может кто-нибудь лучше вариант предложит.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Сортировка</title>
</head>
<body>
<button onclick='sortUp()'>По возрастанию</button>
<button onclick='sortDown()'>По убыванию</button>
<div class="items" id="inventory_bot">
<div class="item" id="12932097827">
<a class="link-btn" href="https://ХХХ" target="_blank">Первый</a>
<div class="parse-btn parse-done">
<div class="parseDataPRGREEN">
-32.47
</div>
<div class="parseDataPRRED">
78.16
</div>
<div class="parse-data-price">
108.8$
</div>
</div>
</div>
<div class="item" id="12932097827">
<a class="link-btn" href="https://ХХХ" target="_blank">Второй</a>
<div class="parse-btn parse-done">
<div class="parseDataPRGREEN">
-41.47
</div>
<div class="parseDataPRRED">
49.16
</div>
<div class="parse-data-price">
108.8$
</div>
</div>
</div>
<div class="item" id="12932097827">
<a class="link-btn" href="https://ХХХ" target="_blank">Третий</a>
<div class="parse-btn parse-done">
<div class="parseDataPRGREEN">
-12.47
</div>
<div class="parseDataPRRED">
11.16
</div>
<div class="parse-data-price">
108.8$
</div>
</div>
</div>
</div>
<script>
// тут будут храниться распарсенные товары
var arrItems = [];
/* формируется массив с товарами */
window.onload = function(){
var itemID = document.querySelectorAll('.item');
var linkBtn = document.querySelectorAll('.link-btn');
var parseDataPRGREEN = document.querySelectorAll('.parseDataPRGREEN');
var parseDataPRRED = document.querySelectorAll('.parseDataPRRED');
var parseDataPrice = document.querySelectorAll('.parse-data-price');
for(var i = 0; i < itemID.length; i++){
var temp = {};
temp.itemID = itemID[i].getAttribute('id');
temp.linkBtn = linkBtn[i].getAttribute('href');
temp.linkText = linkBtn[i].innerHTML;
temp.parseDataPRGREEN = parseDataPRGREEN[i].innerHTML;
temp.parseDataPRRED = parseDataPRRED[i].innerHTML;
temp.parseDataPrice = parseDataPrice[i].innerHTML;
arrItems[arrItems.length] = temp;
}
}
/* Сортировка вверх */
function sortUp(){
function dataSort(dataA, dataB) {
return dataA.parseDataPRGREEN - dataB.parseDataPRGREEN;
}
arrItems.sort(dataSort);
render();
}
/* Сортировка вниз */
function sortDown(){
function dataSort(dataA, dataB) {
return dataA.parseDataPRRED - dataB.parseDataPRRED;
}
arrItems.sort(dataSort);
render();
}
/* Вывод в порядке сортировки */
function render(){
var wrap = document.querySelector('#inventory_bot');
wrap.innerHTML = '';
for(var i = 0; i < arrItems.length; i++){
wrap.innerHTML +=
'<div class="item" id="' + arrItems[i].itemID + '">' +
'<a class="link-btn" href="' + arrItems[i].linkBtn + '" target="_blank">'+ arrItems[i].linkText +'</a>' +
'<div class="parseDataPRGREEN">' + arrItems[i].parseDataPRGREEN + '</div>' +
'<div class="parseDataPRRED">' + arrItems[i].parseDataPRRED + '</div>' +
'<div class="parse-data-price">' + arrItems[i].parseDataPrice + '</div>' +
'</div>'
}
}
</script>
</body>
</html>
|
arooly,
id уникально!!! иначе класс |
Спасибо за уделённое время! Интересное решение)
|
сортировка блоков по значению классов
arooly,
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
<script>
function compare(c, d) {
var e = document.querySelectorAll(".items");
[].slice.call(document.querySelectorAll(".items .item"), 0).sort(function(a, b) {
a = a.querySelector(c).textContent;
b = b.querySelector(c).textContent;
return d ? b - a : a - b
}).forEach(function(a, b) {
e[b].appendChild(a)
})
};
</script>
</head>
<body>
<button onclick='compare(".parseDataPRGREEN")'>По возрастанию</button>
<button onclick='compare(".parseDataPRRED", true)'>По убыванию</button>
<div class="items" id="inventory_bot">
<div class="item" id="12932097827">
<a class="link-btn" href="https://ХХХ" target="_blank">O</a>
<div class="parse-btn parse-done">
<div class="parseDataPRGREEN">
-32.47
</div>
<div class="parseDataPRRED">
78.16
</div>
<div class="parse-data-price">
108.8$
</div>
</div>
</div>
</div>
<div class="items" id="inventory_bot">
<div class="item" id="12932097827">
<a class="link-btn" href="https://ХХХ" target="_blank">O</a>
<div class="parse-btn parse-done">
<div class="parseDataPRGREEN">
-41.47
</div>
<div class="parseDataPRRED">
49.16
</div>
<div class="parse-data-price">
108.8$
</div>
</div>
</div>
</div>
<div class="items" id="inventory_bot">
<div class="item" id="12932097827">
<a class="link-btn" href="https://ХХХ" target="_blank">O</a>
<div class="parse-btn parse-done">
<div class="parseDataPRGREEN">
-12.47
</div>
<div class="parseDataPRRED">
11.16
</div>
<div class="parse-data-price">
108.8$
</div>
</div>
</div>
</div>
</body>
</html>
|
Большое спасибо за ответ! Буду разбираться!
|
Извините за беспокойство. Не могли бы вы объяснить, что делает каждая строчка нашей функции? Хотелось бы понять, чтобы изменить её под себя. Дело в том, что когда адаптируешь под сайт начинает выдавать ошибки.
Возможно это связанно с тем, что в качестве примера указан упрощённый вид кода. Вот код без упрощений: <!DOCTYPE html> <html> <head> <title></title> </head> <body> <div class="items" id="inventory_bot"> <div class="item" id="12932097827"> <div class="r"> FT <span class="float_item"></span> </div> <div class="f"> <span>x</span>1<svg class="f_s"> <use xlink:href="#svg-icon-star" xmlns:xlink="http://www.w3.org/1999/xlink"></use></svg> </div> <div class="p"> <span>$</span> 671.33 </div> <a class="link-btn" href="https://%D0%A5%D0%A5%D0%A5" target="_blank">O</a> <div class="parse-btn parse-done"> <div class="parseDataPRGREEN"> -32.47 </div> <div class="parseDataPRRED"> 78.16 </div> <div class="parse-data-price"> 108.8$ </div> </div> </div> </div> </body> </html> (в коде без упрощения указал лишь один .item в .items) Рассчитываю на вашу помощь. |
Цитата:
Цитата:
|
arooly,
1. какая структура блоков на самом деле? 2. какие блоки хотите сортировать? 3. критерии сортировки? (вроде понятно) 4. блоки на странице присутствуют?(надеюсь) |
Что бы было максимально понятно. Вот есть сайт - https://cs.money/ru.
Я написал для него расширение, которое создает под каждым элементом с классом .item 2 динамически созданных div'a: 1 - ссылка <a class="link-btn" href="https://%D0%A5%D0%A5%D0%A5" target="_blank">O</a> 2 - распарсенные данные <div class="parse-btn parse-done"> <div class="parseDataPRGREEN"> -32.47 </div> <div class="parseDataPRRED"> 78.16 </div> <div class="parse-data-price"> 108.8$ </div> </div> Теперь мне нужно испульзуя распарсенные данные, создать функцию сортировки в расширение, чтобы при нажатии на так же динамически созданный элемент с классом .AllBtnSU происходила сортировка по возрастанию относительно div.parseDataPRGREEN и при нажатии на элемент с классом .AllBtnSD происходила сортировка по убыванию относительно div.parseDataPRRED. Очень надеюсь, что объяснил понятно. Если все же нет - готов уточнить. Сортировать нужно .item. Очень извиняюсь, что напрягаю! |
| Часовой пояс GMT +3, время: 20:14. |