Сортировка по дочерним элементам на 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. Очень извиняюсь, что напрягаю! |
arooly,
не могу помочь, нужен код, смотрите пост №9, или ждите для того, кому достаточно ваших данных. |
Рони, я вас понял. Извиняюсь, что запутал. Сейчас попробуй объяснить так, как вы просите.
вот есть JS: var loadALL = document.createElement('div'), sortElUp = document.createElement('div'), sortElDown = document.createElement('div'), DelUnTop = document.createElement('div'), y = document.createTextNode('Подгрузить'); sortElDown.innerHTML = 'Сортировать на ввод' sortElUp.innerHTML = 'Сортировать на вывод' DelUnTop.innerHTML = 'Убрать непопулярное' sortElUp.setAttribute('class','AllBtnSU') DelUnTop.setAttribute('class','UnTop') sortElDown.setAttribute('class','AllBtnSD') loadALL.setAttribute('class','AllBtn') loadALL.appendChild(y) $('div.block__header__wrap').after(loadALL) $('div.AllBtn').wrap('<div class="Button">') $('div.Button').append(sortElUp) $('div.Button').append(sortElDown) $('div.Button').append(DelUnTop) Этот JS будут через расширение внедрён на сайт и создаст там два нужных div'a: 1 - sortElUp 2 - sortElDown Далее им присваивается class sortElUp.setAttribute('class','AllBtnSU') sortElDown.setAttribute('class','AllBtnSD') Ниже будет вырезанная часть страницы с материалом, что нужно отсортировать. Отменяю, что отсортировать нужно .item по критерию .parseDataPRGREEN и .parseDataPRRED. <!DOCTYPE html> <html> <head> <title></title> </head> <body> <div class="items" id="inventory_bot"> <div class="item" id="12938478918"> <div class="c"> <span class="p5"></span> </div> <div class="im problem_images" style="background-image: url('https://pic.money/kbn_s.jpg?v=16')"></div> <div class="r"> <span class="float_item"></span> </div> <div class="f2"> <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> 2.77 </div><a class="link-btn" href="https://ru.opskins.com/?loc=shop_search&app=730_2&search_item=eSports%20Key&sort=lh" target="_blank">OP</a> <div class="parse-btn parse-done"> <div class="parseDataPRGREEN"> -42.49 </div> <div class="parseDataPRRED"> 51.8 </div> <div class="parse-data-price"> 1.77$ </div> </div> </div> <div class="item" id="12936889139"> <div class="c"> <span class="p5"></span> </div> <div class="im problem_images" style="background-image: url('https://pic.money/j9z_s.jpg?v=16')"></div> <div class="r"> <span class="float_item"></span> </div> <div class="f2"> <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> 2.76 </div><a class="link-btn" href="https://ru.opskins.com/?loc=shop_search&app=730_2&search_item=Chroma%20Case%20Key&sort=lh" target="_blank">OP</a> <div class="parse-btn parse-done"> <div class="parseDataPRGREEN"> -41.96 </div> <div class="parseDataPRRED"> 50.4 </div> <div class="parse-data-price"> 1.78$ </div> </div> </div> <div class="item" id="12939336365"> <div class="im" style="background-image: url('https://pic.money/jgq_s.jpg?v=16')"></div> <div class="r"> FN <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> 2.74 </div><svg class="st"> <use xlink:href="#stattrak-small" xmlns:xlink="http://www.w3.org/1999/xlink"></use></svg><a class="link-btn" href="https://ru.opskins.com/?loc=shop_search&app=730_2&search_item=StatTrak%E2%84%A2%20CZ75-Auto%20|%20Imprint%20(Factory%20New)&sort=lh" target="_blank">OP</a> <div class="parse-btn parse-done"> <div class="parseDataPRGREEN"> 127.96 </div> <div class="parseDataPRRED"> -61.7 </div> <div class="parse-data-price"> 6.94$ </div> </div> </div> <div class="item" id="12938672308|12938547743"> <div class="c"> <span class="a">Все</span> </div> <div class="im problem_images" style="background-image: url('https://pic.money/kvs_s.jpg?v=16')"></div> <div class="r"> <span class="float_item"></span> </div> <div class="f1"> <span>x</span>2<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> 2.74 </div> <div class="ws"> <span class="cr">+</span> </div><a class="link-btn" href="https://ru.opskins.com/?loc=shop_search&app=730_2&search_item=Chroma%202%20Case%20Key&sort=lh" target="_blank">OP</a> <div class="parse-btn parse-done"> <div class="parseDataPRGREEN"> -41.53 </div> <div class="parseDataPRRED"> 49.31 </div> <div class="parse-data-price"> 1.78$ </div> </div> </div> <div class="item" id="12939156444"> <div class="im" style="background-image: url('https://pic.money/k6b_s.jpg?v=16')"></div> <div class="r"> FN <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> 2.35 </div><a class="link-btn" href="https://ru.opskins.com/?loc=shop_search&app=730_2&search_item=MAC-10%20|%20Fade%20(Factory%20New)&sort=lh" target="_blank">OP</a> <div class="parse-btn parse-done"> <div class="parseDataPRGREEN"> -36.04 </div> <div class="parseDataPRRED"> 36.5 </div> <div class="parse-data-price"> 1.67$ </div> </div> </div> </div> </body> </html> Суть в том, чтобы при нажатии на мой динамически созданный div.AllBtnSU и div.AllBtnSD происходила сортировка. Так же ниже прикрепляю картинки которые должны придать ясности. |
|
arooly,
:-? function compare(c, e) { var f = document.querySelectorAll(".items"); [].forEach.call(f, function(d) { [].slice.call(d.querySelectorAll(".item"), 0).sort(function(a, b) { a = a.querySelector(c).textContent; b = b.querySelector(c).textContent; return e ? b - a : a - b }).forEach(function(a, b) { d.appendChild(a) }) }) }; |
вставляю вот так
sortElUp.onclick = function compare(c, e) { var f = document.querySelectorAll(".items"); [].forEach.call(f, function(d) { [].slice.call(d.querySelectorAll(".item"), 0).sort(function(a, b) { a = a.querySelector(c).textContent; b = b.querySelector(c).textContent; return e ? b - a : a - b }).forEach(function(a, b) { d.appendChild(a) }) }) }; При нажатии выдает ошибку следующего толка: Uncaught DOMException: Failed to execute 'querySelector' on 'Element': '[object MouseEvent]' is not a valid selector. https://ibb.co/fiVEVG |
arooly,
....!!! sortElUp.onclick = function { compare(".parseDataPRGREEN") } |
Извините за столь грубую ошибку! Большое спасибо, что помогли! Очень благодарен!
|
Часовой пояс GMT +3, время: 03:54. |