CB's blog

Выделение строк таблицы по клику

Февраль 4, 2007

В этой заметке я расскажу, как можно просто сделать выделение строк таблицы по клику. Будет рассмотрено три варианта: первый — самый простой, второй — с использованием библиотеки Prototype и третий — с использованием библиотеки Prototype и добавлением полосатости таблицы.

Часть 1

Для выделенных строк используется CSS класс selected.

CSS код:

tr.selected {
    background-color: #fc6;
}

JavaScript код:

window.onload = init;

function init() {
   var tab = document.getElementById('tab1');

   if(!tab) {
      return;
   }

   for(var i=tab.rows.length-1; i>=0; i--) {
      tab.rows[i].onclick = rowClick;
   }

   function rowClick() {
      this.className = this.className == "selected" ? "" : "selected";
   }
}

Пример №1 здесь.

Часть 2 — с использованием Prototype

Теперь попробуем сделать то же самое, используя популярную JavaScript-библиотеку Prototype. Функцию $ можно использовать вместо document.getElementById. Удобная функция Element.toggleClassName имеет два аргумента элемент и имя CSS класса, она добавляет CSS класс элементу (если у элемента не было такого класса) или убирает (если был).

CSS код остается прежним.

JavaScript код:

window.onload = init;

function init() {
   var tab = $('tab1');

   if(!tab) {
      return;
   }

   for(var i=tab.rows.length-1; i>=0; i--) {
      tab.rows[i].onclick = rowClick;
   }

   function rowClick() {
      Element.toggleClassName(this, "selected");
   }
}

Преимущество использования Prototype в данном случае — простая работа с множественными CSS классами, что позволяет легко расширять функциональность (см. часть 3).

Пример №2 здесь.

Часть 3 — с использованием Prototype и полосатой таблицей

Весьма уместным дополнением может стать полосатая раскраска таблицы. О том, как можно делать полосатые таблицы я уже когда-то писал. Оказывается, к предыдущему примеру добавить полосатость очень просто. Добавляется (Element.addClassName из библиотеки Prototype) CSS класс even, который присваивается непарным строкам таблицы. А потом CSS класс selected при выделении применяется ко всем строкам таблицы (tr.selected) и "even" строкам (tr.even.selected), чтобы установить цвет выделения "поверх" цвета полос таблицы.

CSS код:

tr.even {
   background-color: #edf3fe;
}

tr.selected, tr.even.selected {
   background-color: #fc6;
}

JavaScript код:

window.onload = init;

function init() {
   var tab = $('tab1');

   if(!tab) {
      return;
   }

   for(var i=tab.rows.length-1; i>=0; i--) {
      tab.rows[i].onclick = rowClick;

      // Делаем таблицу полосатой
      if(i%2==0) {
         Element.addClassName(tab.rows[i], "even");
      }
   }

   function rowClick() {
      Element.toggleClassName(this, "selected");
   }
}

Пример №3 здесь.

Update: тоже самое, но с использованием DOMAssistant вместо Prototype:

JavaScript код:

window.onload = init;

function init() {
   var tab = $('tab1');

   if(!tab) {
      return;
   }

   for(var i=tab.rows.length-1; i>=0; i--) {
      tab.rows[i].onclick = rowClick;

      if(i%2==0) {
         $(tab.rows[i]).addClass("even");
      }
   }

   function rowClick() {
      var row = $(this);

      if(row.hasClass("selected")) {
         row.removeClass("selected")
      }
      else {
         row.addClass("selected")
      }
   }
}

Пример №3 — с использованием DOMAssistant.

Комментарии (7) на “Выделение строк таблицы по клику”

  1. Сергей:

    А как вместо выделения цветом строки таблицы по клику получить значения содержащиеся в ячейках этой строки? и например, записать их в переменные?

  2. svoloshyn:

    2Сергей:

    Вот функция, которая вызывается по клику по строке. Она выводит (alert) поочередно значения ячеек строки, по которой кликнули:

    function rowClick() {
      this.className = this.className == "selected" ? "" : "selected";
    
      // Это добавилось
      row = this;
      for(var i=0; i<=row.cells.length-1; i++) {
        alert(row.cells[i].innerHTML);
      }
    }
    

    Пример можно посмотреть здесь

  3. Сергей:

    А можно пример чтобы выбиралась одна строка, а при выборе второй первая становилась обычной?

    Спасибо.

  4. svoloshyn:

    2Сергей:
    Можно, просто в функцию rowClick следует добавить код который перед тем как раскрасить строку, удалит раскраску (класс selected) у строк которые имеют такой класс.

  5. Сергей:

    Я сделал так:

    function rowClick() {
    for(var i=tab.rows.length-1; i>=0; i–) {
    tab.rows[i].className = “”;
    }
    this.className = this.className == “selected” ? “” : “selected”;
    }

    Работает корректно…
    Может есть более простой путь?

  6. svoloshyn:

    2Сергей: это и так довольно простой путь.

    Проще было бы выбрать по классу, но для этого скороее всего нужен какой-то фреймворк, например на jQuery:

    $(”tr.selected”).removeClass(”selected”);

    (это вместо того что у Вас в цикле).

  7. Сергей:

    Огромное спасибо!

    У Вас очень полезные и качественные статьи.

Добавить комментарий