Сравнить элементы с одинаковым классом и ...
Добрый день, уважаемые :help:
Задача: сравнить содержимое элементов (li) с одинаковым классом (.srav и .srav2), и если во всех одинаковый текст (значение), то присвоить им класс (.odinak). Структура до такая: <ul> <li class="srav">Текст 1</li> <li class="srav"></li> <li class="srav">Текст 3</li> </ul> <ul> <li class="srav2">Текст 4</li> <li class="srav2">Текст 4</li> <li class="srav2">Текст 4</li> </ul Структура после такая: <ul> <li class="srav">Текст 1</li> <li class="srav"></li> <li class="srav">Текст 3</li> </ul> <ul> <li class="srav2 odinak">Текст 4</li> <li class="srav2 odinak">Текст 4</li> <li class="srav2 odinak">Текст 4</li> </ul |
derevo,
может структуру до и после, сейчас только гадать о чём ваша структура, а так два цикла первый прервать если разница обнаружится если нет вторым циклом присвоить класс |
Написал структуру до и после.
Натолкните пожалуйста на решение. |
derevo,
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .odinak { background-color: #228B22; } </style> </head> <body> <ul> <li class="srav">Текст 1</li> <li class="srav"></li> <li class="srav">Текст 3</li> </ul> <ul> <li class="srav2">Текст 4</li> <li class="srav2">Текст 4</li> <li class="srav2">Текст 4</li> </ul> <script> window.addEventListener("DOMContentLoaded", function() { var b = document.querySelectorAll("ul"); [].forEach.call(b, function(a) { a = a.querySelectorAll("li"); var b = a[0].innerHTML; [].every.call(a, function(a) { return a.innerHTML == b }) && [].forEach.call(a, function(a) { a.classList.add("odinak") }) }) }); </script> </body> </html> |
Спасибо, но да, структуру не правильно написал. Нужно по другому.
На скрине показал как выглядит структура. Нужно при клике на чекбокс (только отличия) скрывать строку с одинаковыми значениями. Т.е. получается нужно сравнить все li.osnovtd.tr10 (tr11, tr12, ...) (записать их в массив и там их перебрать и сравнить?), а потом присвоить им класс, для примера .hide И для li.osnovtr.tr10 (tr11, tr12, ...) также присвоить класс .hide ![]() |
derevo,
нарисуйте эту структуру с картинки с кнопкой ... алгоритм скрипта от этого не изменится |
Ну как не измениться, я же специально подсветил на скрине колонку ul в которой вложены li. А нужно сравнить не в колонке ul, а li у разных ul.
|
derevo,
html please :) |
При клике на чекбокс ("только отличия") скрывать строку с одинаковыми значениями (т.е. скрыть строки "Тип акустики - коаксиальная - коаксиальная - коаксиальная" и "Количество полос - 2 - 2 - 2").
Т.е. получается нужно сравнить все li.osnovtd.tr10 (tr11, tr12, ...) (записать их в массив и там их перебрать и сравнить?), а потом присвоить им класс, для примера .hide И для li.osnovtr.tr10 (tr11, tr12, ...) также присвоить класс .hide Имеем такую структуру: <input id="filter" type="checkbox">только отличия <div class="cd-products-table"> <div class="feateres"> <ul class="cd-feateres-list"> <li class="osnovtr tr10">Тип акустики</li> <li class="osnovtr tr11">Количество полос</li> <li class="osnovtr tr12">Мощность номинальная</li> <li class="osnovtr tr13">Мощность максимальная</li> </ul> </div> <div class="cd-products-wrapper"> <ul class="cd-products-coliumns"> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10">коаксиальная</li> <li class="osnovtd tr11">2</li> <li class="osnovtd tr12">60 Вт</li> <li class="osnovtd tr13">180 Вт</li> </ul> </li> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10">коаксиальная</li> <li class="osnovtd tr11">2</li> <li class="osnovtd tr12">30 Вт</li> <li class="osnovtd tr13">90 Вт</li> </ul> </li> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10">коаксиальная</li> <li class="osnovtd tr11">2</li> <li class="osnovtd tr12">60 Вт</li> <li class="osnovtd tr13">240 Вт</li> </ul> </li> </ul> </div> </div> Нужно получить в итоге: <input id="filter" type="checkbox" checked="checked">только отличия <div class="cd-products-table"> <div class="feateres"> <ul class="cd-feateres-list"> <li class="osnovtr tr10 hide">Тип акустики</li> <li class="osnovtr tr11 hide">Количество полос</li> <li class="osnovtr tr12">Мощность номинальная</li> <li class="osnovtr tr13">Мощность максимальная</li> </ul> </div> <div class="cd-products-wrapper"> <ul class="cd-products-coliumns"> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10 hide">коаксиальная</li> <li class="osnovtd tr11 hide">2</li> <li class="osnovtd tr12">60 Вт</li> <li class="osnovtd tr13">180 Вт</li> </ul> </li> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10 hide">коаксиальная</li> <li class="osnovtd tr11 hide">2</li> <li class="osnovtd tr12">30 Вт</li> <li class="osnovtd tr13">90 Вт</li> </ul> </li> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10 hide">коаксиальная</li> <li class="osnovtd tr11 hide">2</li> <li class="osnovtd tr12">60 Вт</li> <li class="osnovtd tr13">240 Вт</li> </ul> </li> </ul> </div> </div> |
derevo,
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .hide { display: none; } </style> </head> <body> <input id="filter" type="checkbox">только отличия <div class="cd-products-table"> <div class="feateres"> <ul class="cd-feateres-list"> <li class="osnovtr tr10">Тип акустики</li> <li class="osnovtr tr11">Количество полос</li> <li class="osnovtr tr12">Мощность номинальная</li> <li class="osnovtr tr13">Мощность максимальная</li> </ul> </div> <div class="cd-products-wrapper"> <ul class="cd-products-coliumns"> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10">коаксиальная</li> <li class="osnovtd tr11">2</li> <li class="osnovtd tr12">60 Вт</li> <li class="osnovtd tr13">180 Вт</li> </ul> </li> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10">коаксиальная</li> <li class="osnovtd tr11">2</li> <li class="osnovtd tr12">30 Вт</li> <li class="osnovtd tr13">90 Вт</li> </ul> </li> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10">коаксиальная</li> <li class="osnovtd tr11">2</li> <li class="osnovtd tr12">60 Вт</li> <li class="osnovtd tr13">240 Вт</li> </ul> </li> </ul> </div> </div> <script> window.addEventListener("DOMContentLoaded", function() { var b = document.querySelector("#filter"); b.addEventListener("change", function() { [".tr10", ".tr11", ".tr12", ".tr13"].forEach(function(a) { a = document.querySelectorAll(a); var c = a[1].innerHTML, c = b.checked && [].every.call(a, function(a, b) { return !b || a.innerHTML == c }) ? "add" : "remove"; [].forEach.call(a, function(a) { a.classList[c]("hide") }) }) }) }); </script> </body> </html> |
Спасибо, это работает!
А подскажи как добавить еще цикл, чтобы вместо ".tr10", ".tr11", ... тут значения сами перебирались: [".tr10", ".tr11", ".tr12", ".tr13"].forEach(function(a) { У меня есть такой код: Php: $trnumber = 20; Script: var trnumber = 0; while (trnumber < <?php echo $trnumber ?>) { $('.tr'+trnumber).css('height', ''); $('.tr'+trnumber).height( getMaxHeight($('.tr'+trnumber)) ); trnumber++; } Как можно добавить подобный цикл в твой код? типа, как: window.addEventListener("DOMContentLoaded", function() { var b = document.querySelector("#filter"); //var trnumber = 0; b.addEventListener("change", function() { //while (trnumber < <?php echo $trnumber ?>) { //[".tr"+trnumber].forEach(function(a) { [".tr10", ".tr11", ".tr12", ".tr13"].forEach(function(a) { a = document.querySelectorAll(a); var c = a[1].innerHTML, c = b.checked && [].every.call(a, function(a, b) { return !b || a.innerHTML == c }) ? "add" : "remove"; [].forEach.call(a, function(a) { a.classList[c]("hide") }) }) //trnumber++; //} }) }); |
derevo,
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .hide { display: none; } { } </style> </head> <body> <input id="filter" type="checkbox">только отличия <div class="cd-products-table"> <div class="feateres"> <ul class="cd-feateres-list"> <li class="osnovtr tr10">Тип акустики</li> <li class="osnovtr tr11">Количество полос</li> <li class="osnovtr tr12">Мощность номинальная</li> <li class="osnovtr tr13">Мощность максимальная</li> </ul> </div> <div class="cd-products-wrapper"> <ul class="cd-products-coliumns"> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10">коаксиальная</li> <li class="osnovtd tr11">2</li> <li class="osnovtd tr12">60 Вт</li> <li class="osnovtd tr13">180 Вт</li> </ul> </li> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10">коаксиальная</li> <li class="osnovtd tr11">2</li> <li class="osnovtd tr12">30 Вт</li> <li class="osnovtd tr13">90 Вт</li> </ul> </li> <li class="product"> <ul class="cd-feateres-list"> <li class="osnovtd tr10">коаксиальная</li> <li class="osnovtd tr11">2</li> <li class="osnovtd tr12">60 Вт</li> <li class="osnovtd tr13">240 Вт</li> </ul> </li> </ul> </div> </div> <script> window.addEventListener("DOMContentLoaded", function() { var b = document.querySelector("#filter"); b.addEventListener("change", function() { [].forEach.call(document.querySelectorAll('.feateres li'),function(a,k) { a = document.querySelectorAll('.cd-feateres-list li:nth-child('+(k+1)+')'); var c = a[1].innerHTML, c = b.checked && [].every.call(a, function(a, b) { return !b || a.innerHTML == c }) ? "add" : "remove"; [].forEach.call(a, function(a) { a.classList[c]("hide") }) }) }) }); </script> </body> </html> |
Спасибо. Теперь все ок.
А я вот как забабахал, тоже заработало :D function toggleCompare(objCheckbox) { var chboxfilter = document.querySelector('.filter_otlich'); var trnumber = 1; while (trnumber < <?php echo $trnumber ?>) { var newtrnumber = '.tr'+trnumber; [newtrnumber].forEach(function(trfilter) { trfilter = document.querySelectorAll(trfilter); var cfilter = trfilter[1].innerHTML, cfilter = chboxfilter.checked && [].every.call(trfilter, function(trfilter, chboxfilter) { return !chboxfilter || trfilter.innerHTML == cfilter }) ? 'add' : 'remove'; [].forEach.call(trfilter, function(trfilter) { trfilter.classList[cfilter]('hide') }) }) trnumber++; } } фигня? |
derevo,
как вам удобнее :) |
т.е. получается без разницы? как отблагодарить?
|
Часовой пояс GMT +3, время: 08:16. |