Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.01.2018, 13:03
Новичок на форуме
Отправить личное сообщение для alogin Посмотреть профиль Найти все сообщения от alogin
 
Регистрация: 10.01.2018
Сообщений: 5

Подсветка строк таблицы по условию
Добрый день, Гуру

Есть массив цветов состоящий из 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];
    }
  }
}
Ответить с цитированием
  #2 (permalink)  
Старый 10.01.2018, 13:13
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

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>

Последний раз редактировалось Nexus, 10.01.2018 в 13:21.
Ответить с цитированием
  #3 (permalink)  
Старый 10.01.2018, 13:28
Новичок на форуме
Отправить личное сообщение для alogin Посмотреть профиль Найти все сообщения от alogin
 
Регистрация: 10.01.2018
Сообщений: 5

Спасибо за быстрый ответ

А если в таблице будет несколько столбцов, и искать нужно будет по 2 или 3 столбцу

я так понимаю, что
var val=row.querySelector('td').innerHTML;
Будет искать совпадения только по первому столбцу
Ответить с цитированием
  #4 (permalink)  
Старый 10.01.2018, 13:30
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Сообщение от alogin
я так понимаю, что
var val=row.querySelector('td').innerHTML;
Будет искать совпадения только по первому столбцу
Верно.

Сообщение от alogin
А если в таблице будет несколько столбцов, и искать нужно будет по 2 или 3 столбцу
Если нужно будет, поправите условия.
В вашем примере у таблицы 1 колонка.
Ответить с цитированием
  #5 (permalink)  
Старый 10.01.2018, 14:28
Новичок на форуме
Отправить личное сообщение для alogin Посмотреть профиль Найти все сообщения от alogin
 
Регистрация: 10.01.2018
Сообщений: 5

Спасибо за ответ
Только недавно начал разбираться с js, не работал с querySelector
Я так понимаю что идет обращение к селекторам css
Но если я пишу
var val=row.querySelector('td:nth-child(2)').innerHTML;
Так я обращаюсь ко второй ячейке таблицы(как мне кажется ) но дает ошибку что не возможно прочитать свойство innerHTML

Ошибка в селекторе, но чет я не пойму как правильно обратиться ко 2й ячейке строки.
Ответить с цитированием
  #6 (permalink)  
Старый 10.01.2018, 14:34
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

alogin, https://jsfiddle.net/aecoxyyw/4/
https://learn.javascript.ru/searchin...erySelectorAll
Ответить с цитированием
  #7 (permalink)  
Старый 10.01.2018, 14:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

шифровка из центра ... индекс ячейки указать в строке 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>

Последний раз редактировалось рони, 10.01.2018 в 14:43.
Ответить с цитированием
  #8 (permalink)  
Старый 10.01.2018, 14:55
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

рони, действительно "шифровка", однако, по-моему, она излишня.
Безусловно красивое решение, но трудночитаемое.
Ответить с цитированием
  #9 (permalink)  
Старый 10.01.2018, 15:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от Nexus
она излишня.
???
Ответить с цитированием
  #10 (permalink)  
Старый 10.01.2018, 15:20
Новичок на форуме
Отправить личное сообщение для alogin Посмотреть профиль Найти все сообщения от alogin
 
Регистрация: 10.01.2018
Сообщений: 5

Народ, спасибо большое, все заработало
правда с примером nexus'a так и не разобрался и почему то к моей таблице он не заработал, а заработал пример Рони.
+ в карму обоим

Если возможно, то распишите логику работы ваших примеров
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсветка строк таблицы Ext.grid.Panel khusamov ExtJS 5 28.04.2016 18:48
Добавление строк в таблицу и скрытие таблицы. III Общие вопросы Javascript 39 20.11.2015 10:05
Зафиксировать шапку таблицы html по условию sashgera Элементы интерфейса 7 02.01.2015 04:10
Подсветка строк и столбцов таблицы html sashgera Элементы интерфейса 8 20.12.2014 20:47
Автоматическая подсветка строк таблицы mihha Элементы интерфейса 5 01.02.2009 01:28