Выделение строк таблицы по клику
Февраль 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";
}
}
Часть 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).
Часть 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");
}
}
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")
}
}
}
Февраль 22nd, 2007 в 3:41 pm
А как вместо выделения цветом строки таблицы по клику получить значения содержащиеся в ячейках этой строки? и например, записать их в переменные?
Февраль 22nd, 2007 в 4:38 pm
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); } }Пример можно посмотреть здесь
Декабрь 5th, 2008 в 3:44 pm
А можно пример чтобы выбиралась одна строка, а при выборе второй первая становилась обычной?
Спасибо.
Декабрь 5th, 2008 в 3:48 pm
2Сергей:
Можно, просто в функцию rowClick следует добавить код который перед тем как раскрасить строку, удалит раскраску (класс selected) у строк которые имеют такой класс.
Декабрь 7th, 2008 в 1:01 pm
Я сделал так:
function rowClick() {
for(var i=tab.rows.length-1; i>=0; i–) {
tab.rows[i].className = “”;
}
this.className = this.className == “selected” ? “” : “selected”;
}
Работает корректно…
Может есть более простой путь?
Декабрь 7th, 2008 в 1:44 pm
2Сергей: это и так довольно простой путь.
Проще было бы выбрать по классу, но для этого скороее всего нужен какой-то фреймворк, например на jQuery:
$(”tr.selected”).removeClass(”selected”);
(это вместо того что у Вас в цикле).
Декабрь 7th, 2008 в 1:47 pm
Огромное спасибо!
У Вас очень полезные и качественные статьи.