Подсветка строк таблицы по условию
Добрый день, Гуру
Есть массив цветов состоящий из 3х цветов И есть таблица со значениями Нужно чтобы строки с одинаковыми значениями подсвечивались цветами из массива по порядку, т.е. для первых одинаковых был нулевой элемент массива, для вторых одинаковых был 1 элемент массива, и т.д. Как только цвета заканчиваются и выборка опять начинается с 0 Проблема как раз стоит в выборе цвета и его обнулении при достижении конца массива. Додумался сделать чтобы оно рандомно брало номер массива, но это хорошо работает, когда цветов от 35 и более, а нужно чтобы оно цвета переберало по порядку Если есть какие нибудь мысли - прошу помочь. пример того что сделал https://jsfiddle.net/aecoxyyw/ так же ниже сам код <table id="t1"> <tr><td>1</td></tr> <tr><td>1</td></tr> <tr><td>2</td></tr> <tr><td>2</td></tr> <tr><td>2</td></tr> <tr><td>3</td></tr> <tr><td>3</td></tr> <tr><td>3</td></tr> <tr><td>3</td></tr> <tr><td>4</td></tr> <tr><td>4</td></tr> </table> var objT = document.getElementById('t1'); var r = objT.rows.length; var color = ['white', 'grey', 'yellow']; for (i = 1; i < r; i++) { var res_i = objT.rows[i].cells[0].innerHTML; var rand = Math.floor(Math.random() * color.length); for (j = 0; j < r; j++) { var res_j = objT.rows[j].cells[0].innerHTML; if (res_i == res_j) { objT.rows[j].style.background = color[rand]; } } } |
https://jsfiddle.net/aecoxyyw/3/
<table id="t1"> <tr><td>1</td></tr> <tr><td>1</td></tr> <tr><td>5</td></tr> <tr><td>2</td></tr> <tr><td>2</td></tr> <tr><td>2</td></tr> <tr><td>3</td></tr> <tr><td>3</td></tr> <tr><td>3</td></tr> <tr><td>3</td></tr> <tr><td>4</td></tr> <tr><td>4</td></tr> </table> <script> (function(){ var COLORS=['red','green','blue'], rows=document.querySelectorAll('#t1 tr'), last_value, color_index=-1, change_index=true; [].forEach.call(rows,function(row,index){ var val=row.querySelector('td').innerHTML; if(val==last_value) return change_index=([row,rows[index-1]].forEach(function(node){ node.style.backgroundColor=COLORS[color_index]; })||true); if(change_index) color_index=!COLORS[++color_index]?0:color_index; change_index=false; last_value=val; }); })(); </script> |
Спасибо за быстрый ответ
А если в таблице будет несколько столбцов, и искать нужно будет по 2 или 3 столбцу я так понимаю, что var val=row.querySelector('td').innerHTML;Будет искать совпадения только по первому столбцу |
Цитата:
Цитата:
В вашем примере у таблицы 1 колонка. |
Спасибо за ответ
Только недавно начал разбираться с js, не работал с querySelector Я так понимаю что идет обращение к селекторам css Но если я пишу var val=row.querySelector('td:nth-child(2)').innerHTML;Так я обращаюсь ко второй ячейке таблицы(как мне кажется :) ) но дает ошибку что не возможно прочитать свойство innerHTML Ошибка в селекторе, но чет я не пойму как правильно обратиться ко 2й ячейке строки. |
|
:) шифровка из центра ... индекс ячейки указать в строке 32
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> </head> <body> <table id="t1"> <tr><td>1</td></tr> <tr><td>1</td></tr> <tr><td>5</td></tr> <tr><td>2</td></tr> <tr><td>2</td></tr> <tr><td>2</td></tr> <tr><td>3</td></tr> <tr><td>3</td></tr> <tr><td>3</td></tr> <tr><td>3</td></tr> <tr><td>4</td></tr> <tr><td>4</td></tr> </table> <script> (function(i) { var c = ["red", "green", "blue"], a; [].forEach.call(document.querySelectorAll("#t1 tr"), function(d, e, b) { (b = b[++e]) && b.cells[i].textContent == d.cells[i].textContent ? (a || (a = c.shift()), d.style.backgroundColor = a, b.style.backgroundColor = a) : a && (c.push(a), a = void 0); }); })(0); </script> </body> </html> |
рони, действительно "шифровка", однако, по-моему, она излишня.
Безусловно красивое решение, но трудночитаемое. |
Цитата:
|
Народ, спасибо большое, все заработало
правда с примером nexus'a так и не разобрался и почему то к моей таблице он не заработал, а заработал пример Рони. + в карму обоим Если возможно, то распишите логику работы ваших примеров |
Цитата:
|
Цитата:
Так, по-моему мнению, код читается лучше: (function(i) { var colors = ["red", "green", "blue"], use_color; [].forEach.call(document.querySelectorAll("#t1 tr"), function(row, index, next_row) { next_row=next_row[++index]; if(row.cells[i].textContent == next_row.cells[i].textContent){ use_color=use_color || colors.shift(); row.style.backgroundColor = use_color; next_row.style.backgroundColor = use_color; }else if(use_color){ colors.push(use_color); use_color=undefined; }; }); })(0); |
Стало чуть понятнее, не подумал про массив цветов, где можно добавлять в конец массива первый элемент, век живи, век учись
|
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 14:52. |