Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Апгрейд checkbox`a


Автор: Temp 9.11.2005, 01:36
Есть табличка, первая калонка в ней чекбоксы.
Необходимо:
1 - Сделать кнопки "поставить/убрать" галочки во всех чекбоксах.
2 - При наведении на строку строка подсвечивается <tr bgcolor=#color_1>
3 - При клине на строке или чекбоксе ставится галочка
4 - Если чекбокс активен строка подсвечивается <tr bgcolor=#color_2>

Взята аналогия с phpmyadmin

Пишите пожалуйста подробные примеры, если Вас это не затруднить.


спасибо smile

Автор: Ciber SLasH 9.11.2005, 12:16
Хотел было помочь, да сам увяз в этой проблеме.
Сделал несколько вариантов, но к сожалению кроссбраузерности добиться так и не удалось...

Вот то как это сделано в phpMyAdmin:
Код

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<script type='text/javascript'>
/**
 * This array is used to remember mark status of rows in browse mode
 */
var marked_row = new Array;

/**
 * Sets/unsets the pointer and marker in browse mode
 *
 * @param   object    the table row
 * @param   integer  the row number
 * @param   string    the action calling this script (over, out or click)
 * @param   string    the default background color
 * @param   string    the color to use for mouseover
 * @param   string    the color to use for marking a row
 *
 * @return  boolean  whether pointer is set or not
 */
function setPointer(theRow, theRowNum, theAction, theDefaultColor, thePointerColor, theMarkColor)
{
    var theCells = null;

    // 1. Pointer and mark feature are disabled or the browser can't get the
    //    row -> exits
    if ((thePointerColor == '' && theMarkColor == '')
        || typeof(theRow.style) == 'undefined') {
        return false;
    }

    // 2. Gets the current row and exits if the browser can't get it
    if (typeof(document.getElementsByTagName) != 'undefined') {
        theCells = theRow.getElementsByTagName('td');
    }
    else if (typeof(theRow.cells) != 'undefined') {
        theCells = theRow.cells;
    }
    else {
        return false;
    }

    // 3. Gets the current color...
    var rowCellsCnt  = theCells.length;
    var domDetect    = null;
    var currentColor = null;
    var newColor     = null;
    // 3.1 ... with DOM compatible browsers except Opera that does not return
    //         valid values with "getAttribute"
    if (typeof(window.opera) == 'undefined'
        && typeof(theCells[0].getAttribute) != 'undefined') {
        currentColor = theCells[0].getAttribute('bgcolor');
        domDetect    = true;
    }
    // 3.2 ... with other browsers
    else {
        currentColor = theCells[0].style.backgroundColor;
        domDetect    = false;
    } // end 3

    // 3.3 ... Opera changes colors set via HTML to rgb(r,g,b) format so fix it
    if (currentColor.indexOf("rgb") >= 0)
    {
        var rgbStr = currentColor.slice(currentColor.indexOf('(') + 1,
                                     currentColor.indexOf(')'));
        var rgbValues = rgbStr.split(",");
        currentColor = "#";
        var hexChars = "0123456789ABCDEF";
        for (var i = 0; i < 3; i++)
        {
            var v = rgbValues[i].valueOf();
            currentColor += hexChars.charAt(v/16) + hexChars.charAt(v%16);
        }
    }

    // 4. Defines the new color
    // 4.1 Current color is the default one
    if (currentColor == ''
        || currentColor.toLowerCase() == theDefaultColor.toLowerCase()) {
        if (theAction == 'over' && thePointerColor != '') {
            newColor              = thePointerColor;
        }
        else if (theAction == 'click' && theMarkColor != '') {
            newColor              = theMarkColor;
            marked_row[theRowNum] = true;
            // Garvin: deactivated onclick marking of the checkbox because it's also executed
            // when an action (like edit/delete) on a single item is performed. Then the checkbox
            // would get deactived, even though we need it activated. Maybe there is a way
            // to detect if the row was clicked, and not an item therein...
            // document.getElementById('id_rows_to_delete' + theRowNum).checked = true;
        }
    }
    // 4.1.2 Current color is the pointer one
    else if (currentColor.toLowerCase() == thePointerColor.toLowerCase()
             && (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum])) {
        if (theAction == 'out') {
            newColor              = theDefaultColor;
        }
        else if (theAction == 'click' && theMarkColor != '') {
            newColor              = theMarkColor;
            marked_row[theRowNum] = true;
            // document.getElementById('id_rows_to_delete' + theRowNum).checked = true;
        }
    }
    // 4.1.3 Current color is the marker one
    else if (currentColor.toLowerCase() == theMarkColor.toLowerCase()) {
        if (theAction == 'click') {
            newColor              = (thePointerColor != '')
                                  ? thePointerColor
                                  : theDefaultColor;
            marked_row[theRowNum] = (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum])
                                  ? true
                                  : null;
            // document.getElementById('id_rows_to_delete' + theRowNum).checked = false;
        }
    } // end 4

    // 5. Sets the new color...
    if (newColor) {
        var c = null;
        // 5.1 ... with DOM compatible browsers except Opera
        if (domDetect) {
            for (c = 0; c < rowCellsCnt; c++) {
                theCells[c].setAttribute('bgcolor', newColor, 0);
            } // end for
        }
        // 5.2 ... with other browsers
        else {
            for (c = 0; c < rowCellsCnt; c++) {
                theCells[c].style.backgroundColor = newColor;
            }
        }
    } // end 5

    return true;
} // end of the 'setPointer()' function
</script>
</head>

<body bgcolor="#F5F5F5">
<table border="0" cellpadding="2" cellspacing="1">
<tr>
    <th id="th1">&nbsp;</th>
    <th id="th2">&nbsp;Поле&nbsp;</th>
    <th id="th3">Тип</th>
    <th>Сравнение</th>
    <th id="th5">Ноль</th>
</tr>

<tr onmouseover="setPointer(this, 1, 'over', '#E5E5E5', '#CCFFCC', '#FFCC99');" onmouseout="setPointer(this, 1, 'out', '#E5E5E5', '#CCFFCC', '#FFCC99');" onmousedown="setPointer(this, 1, 'click', '#E5E5E5', '#CCFFCC', '#FFCC99');">
    <td align="center" bgcolor="#E5E5E5">
        <input type="checkbox" name="selected_fld[]" value="Host" id="checkbox_row_1"  />
    </td>
    <td  onmousedown="document.getElementById('checkbox_row_1').checked = (document.getElementById('checkbox_row_1').checked ? false : true);"  bgcolor="#E5E5E5" nowrap="nowrap">&nbsp;<label onclick="return (document.getElementById('checkbox_row_1') ? false : true)" for="checkbox_row_1"><u>Host</u></label>&nbsp;</td>
    <td  onmousedown="document.getElementById('checkbox_row_1').checked = (document.getElementById('checkbox_row_1').checked ? false : true);"  bgcolor="#E5E5E5" nowrap="nowrap">char(60)<bdo dir="ltr"></bdo></td>
    <td bgcolor="#E5E5E5"  onmousedown="document.getElementById('checkbox_row_1').checked = (document.getElementById('checkbox_row_1').checked ? false : true);" ><dfn title="Юникод (многоязычный),  Двоичный ">utf8_bin</dfn></td>
    <td  onmousedown="document.getElementById('checkbox_row_1').checked = (document.getElementById('checkbox_row_1').checked ? false : true);"  bgcolor="#E5E5E5">Нет&nbsp;</td>
</tr>

<tr  onmouseover="setPointer(this, 2, 'over', '#D5D5D5', '#CCFFCC', '#FFCC99');" onmouseout="setPointer(this, 2, 'out', '#D5D5D5', '#CCFFCC', '#FFCC99');" onmousedown="setPointer(this, 2, 'click', '#D5D5D5', '#CCFFCC', '#FFCC99');">
    <td align="center" bgcolor="#D5D5D5">
        <input type="checkbox" name="selected_fld[]" value="Db" id="checkbox_row_2"  />
    </td>
    <td  onmousedown="document.getElementById('checkbox_row_2').checked = (document.getElementById('checkbox_row_2').checked ? false : true);"  bgcolor="#D5D5D5" nowrap="nowrap">&nbsp;<label onclick="return (document.getElementById('checkbox_row_2') ? false : true)" for="checkbox_row_2"><u>Db</u></label>&nbsp;</td>
    <td  onmousedown="document.getElementById('checkbox_row_2').checked = (document.getElementById('checkbox_row_2').checked ? false : true);"  bgcolor="#D5D5D5" nowrap="nowrap">char(64)<bdo dir="ltr"></bdo></td>
    <td bgcolor="#D5D5D5"  onmousedown="document.getElementById('checkbox_row_2').checked = (document.getElementById('checkbox_row_2').checked ? false : true);" ><dfn title="Юникод (многоязычный),  Двоичный ">utf8_bin</dfn></td>
    <td  onmousedown="document.getElementById('checkbox_row_2').checked = (document.getElementById('checkbox_row_2').checked ? false : true);"  bgcolor="#D5D5D5">Нет&nbsp;</td>
</tr>

<tr  onmouseover="setPointer(this, 3, 'over', '#E5E5E5', '#CCFFCC', '#FFCC99');" onmouseout="setPointer(this, 3, 'out', '#E5E5E5', '#CCFFCC', '#FFCC99');" onmousedown="setPointer(this, 3, 'click', '#E5E5E5', '#CCFFCC', '#FFCC99');">
    <td align="center" bgcolor="#E5E5E5">
        <input type="checkbox" name="selected_fld[]" value="User" id="checkbox_row_3"  />
    </td>
    <td  onmousedown="document.getElementById('checkbox_row_3').checked = (document.getElementById('checkbox_row_3').checked ? false : true);"  bgcolor="#E5E5E5" nowrap="nowrap">&nbsp;<label onclick="return (document.getElementById('checkbox_row_3') ? false : true)" for="checkbox_row_3"><u>User</u></label>&nbsp;</td>
    <td  onmousedown="document.getElementById('checkbox_row_3').checked = (document.getElementById('checkbox_row_3').checked ? false : true);"  bgcolor="#E5E5E5" nowrap="nowrap">char(16)<bdo dir="ltr"></bdo></td>
    <td bgcolor="#E5E5E5"  onmousedown="document.getElementById('checkbox_row_3').checked = (document.getElementById('checkbox_row_3').checked ? false : true);" ><dfn title="Юникод (многоязычный),  Двоичный ">utf8_bin</dfn></td>
    <td  onmousedown="document.getElementById('checkbox_row_3').checked = (document.getElementById('checkbox_row_3').checked ? false : true);"  bgcolor="#E5E5E5">Нет&nbsp;</td>
</tr>
</table>
</body>
</html>


дальше мои варианты в порядке возрастания сложности:
5) Таблица aka phpMyAdmin (1-1).htm:
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251' />
<meta name="Generator" content='EditPlus 2.12' />
<meta name="Author" content='Ciber SLasH' />
<title>JavaScript :: Ячейки таблицы aka phpMyAdmin</title>
<style type='text/css'>
caption {font: bold 1.2em Arial, Helvetica; color: navy}
thead {font: bold 0.9em sans-serif; text-align: center; background: red}
table, td {border: 1px solid black; cursor: default}
.defaultColor {background: #F3F3F3}
.activeColor {background: #99FFCC}
.pushedColor {background: #FFCC99}
</style>
</head>

<body>
<table class='defaultColor' id='tbList' cellspacing="0" cellpadding="3" align="center">
<caption>Список исполнителей</caption>
<thead>
    <tr><td colspan="2">Группа / Альбом</td><td>Год</td><td>Формат</td><td>Цена</td><td>ID-товара</td></tr>
</thead>
<tbody>
    <tr><td><input type="checkbox" /></td><td>Гражданская Оборона "Долгая Счастливая Жизнь"</td><td>2004</td><td>OGG q6</td><td>$1.00</td><td>147852369</td></tr>
    <tr><td><input type="checkbox" /></td><td>PurgeN "Протест Деталей Механизма"</td><td>2004</td><td>OGG q6</td><td>$0.95</td><td>123789456</td></tr>
    <tr><td><input type="checkbox" /></td><td>Наив "Живой И Невредимый"</td><td>2004</td><td>MP3 192kbps CBR</td><td>$0.50</td><td>159753852</td></tr>
</tbody>
</table>
<script type='text/javascript'>
var obj = document.getElementById('tbList');  // ссылка на нашу таблицу

//--[ Украшения ]---------------------------------------------------------------
// Формат {font-weight: bold}; Цена {font-weight: bold; color: green}
var colNumFormat, colNumPrice;  // colNumFormat - номер колонки "Формат", colNumPrice - номер колонки "Цена"
var colHeadCount = obj.rows[0].cells.length;  // число колонок в заголовке таблице (нулевая строка)
// Ищем в заголовке ячейку с соответствующими названиями
for (var i = 0; i < colHeadCount; i++) {
  //alert(obj.rows[0].cells[i].innerText + ' [' +i+ ']')
  if (obj.rows[0].cells[i].innerText == 'Формат') colNumFormat = i;
  if (obj.rows[0].cells[i].innerText == 'Цена') colNumPrice = i;
}
// Пробегаем по всей таблице и преукрашиваем её
for (var j = 1; j < obj.rows.length; j++) {  // строки (1..n)
  for (var i = 0; i < obj.rows[j].cells.length; i++) {  // столбцы (1..n)
    if (i == 0)  // если нулевая ячейка текущей строки, то...
      // У каждого элем. INPUT убераем фокусировку
      obj.rows[j].cells[0].childNodes[0].onclick = function() {
        this.blur();
        return false;
      }
    // Для колонок "Формат" и "Цена" (colNumFormat+1 — т.к. все строки, кроме нулевой, имеют ячеек на 1 больше)
    if (i == colNumFormat+1) {  // если колонка "Формат", то...
      obj.rows[j].cells[i].style.fontWeight = 'bold';
      obj.rows[j].cells[i].style.color = 'green';
    }
    if (i == colNumPrice+1) {   // если колонка "Цена", то...
      obj.rows[j].cells[i].style.fontWeight = 'bold';
      obj.rows[j].cells[i].style.color = 'blue';
    }
  }
  // Для каждой строки назначаем обработчик событий
  with (obj.rows[j]) {
    onmouseover = MouseEnter;
    onmouseout = MouseLeave;
    onmousedown = MouseDown;
  }
}

/*** Обработчик события onMouseOver текущей строки ***/
function MouseEnter(event) {
var evt = event ? event : window.event;
var target = evt.target ? evt.target : evt.srcElement;
var objTR = target;  // текущая строка
var objInput;  // ссылка на элем. INPUT текущей строки, нулевой ячейки

  while (objTR.tagName.toUpperCase() != 'TR') objTR = objTR.parentElement;
  objInput = objTR.childNodes[0].childNodes[0];

  // Если checkbox НЕ чекнутый, то меняем имя класса текущей строки таблицы
  if (! objInput.checked) objTR.className = 'activeColor';
}

/*** Обработчик события onMouseLeave текущей строки ***/
function MouseLeave(event) {
var evt = event ? event : window.event;
var target = evt.target ? evt.target : evt.srcElement;
var objTR = target;  // текущая строка
var objInput;  // ссылка на элем. INPUT текущей строки, нулевой ячейки

  while (objTR.tagName.toUpperCase() != 'TR') objTR = objTR.parentElement;
  objInput = objTR.childNodes[0].childNodes[0];

  // Если checkbox НЕ чекнутый, то меняем имя класса текущей строки таблицы
  if (! objInput.checked) objTR.className = 'defaultColor';
}

/*** Обработчик события onMouseDown текущей строки ***/
function MouseDown(event) {
var evt = event ? event : window.event;
var target = evt.target ? evt.target : evt.srcElement;
var objTR = target;  // текущая строка
var objInput;  // ссылка на элем. INPUT текущей строки, нулевой ячейки

  while (objTR.tagName.toUpperCase() != 'TR') objTR = objTR.parentElement;
  objInput = objTR.childNodes[0].childNodes[0];

  if (objInput.checked) {  // если checkbox чекнутый, то...
    objInput.checked = false;        // разчекиваем его
    objTR.className = 'activeColor';  // меняем имя класса текущей строки таблицы
  }
  else {  // если checkbox НЕ чекнутый, то...
    objInput.checked = true;         // чекаем его
    objTR.className = 'pushedColor';  // меняем имя класса текущей строки таблицы
  }
}
</script>
</body>
</html>


Не хочется сдирать с оригинала, т.к. мне не нравится, что там слишком много лишнего кода. Да и события нужно вручную прописывать для каждой строки/ячейки.

Хотелось бы довести до кроссбраузерности (всмысле для: IE5+, Opera7+, FireFox1+) свои 5 или 4 варианты (впринципе одно и тоже).

Обращение к знатокам (Sardar, Aliance, etc.): I need help !! smile
Уж больно заинтересовала меня темка smile

PS: к сожалению все варианты не влезли в пост, поэтому первые 4 варианта — в аттаче.

Автор: Aliance 9.11.2005, 20:02
Цитата(Temp @ 9.11.2005, 02:36)
Пишите пожалуйста подробные примеры

В данном разделе не пишут с нуля, а направляют, подталкивают, помогают.

Если тебе нужно полностью готовый скрипт с нуля, еще и полный, еще и быстрее - то тебе в раздел «Работа»

Кроме того, прочтя Правила форума: http://forum.vingrad.ru/index.php?s=&act=SR&f=27 мы узнаем, что один топик - один вопрос.

Автор: Ciber SLasH 10.11.2005, 02:54
Всё-таки добился нормальной работы в нескольких браузерах... smile
6) Таблица aka phpMyAdmin (1-2).htm:
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251' />
<meta name="Generator" content='EditPlus 2.12' />
<meta name="Author" content='Ciber SLasH' />
<title>JavaScript :: Ячейки таблицы aka phpMyAdmin</title>
<style type='text/css'>
caption {font: bold 1.2em Arial, Helvetica; color: navy}
thead {font: bold 0.9em sans-serif; text-align: center; background: red}
table, td {border: 1px solid black; cursor: default}
</style>
</head>

<body>
<table class='defaultColor' id='tbList' cellspacing="0" cellpadding="3" align="center">
<caption>Список исполнителей</caption>
<thead>
    <tr><td colspan="2">Группа / Альбом</td><td>Год</td><td>Формат</td><td>Цена</td><td>ID-товара</td></tr>
</thead>
<tbody>
    <tr><td><input type="checkbox" /></td><td>Гражданская Оборона "Долгая Счастливая Жизнь"</td><td>2004</td><td>OGG q6</td><td>$1.00</td><td>147852369</td></tr>
    <tr><td><input type="checkbox" /></td><td>PurgeN "Протест Деталей Механизма"</td><td>2004</td><td>OGG q6</td><td>$0.95</td><td>123789456</td></tr>
    <tr><td><input type="checkbox" /></td><td>Наив "Живой И Невредимый"</td><td>2004</td><td>MP3 192kbps CBR</td><td>$0.50</td><td>159753852</td></tr>
</tbody>
</table>
<script type='text/javascript'>
////////////////////////////////////////////////////////////////////////////////
//==[ Вспомогательные функции ]=================================================
////////////////////////////////////////////////////////////////////////////////

/*** Преобразование числа в строковое HEX-значение *(ver 1)**/
function Int2Hex_1(Value, Digits) {
////////////////////////////////////////////////////////////////////////////////
var HEX = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
var Result = ''
var d = Math.abs(Value)
var q,a,d,Len  // d — делимое; q — частное; a — остаток
////////////////////////////////////////////////////////////////////////////////
  do {
    q = d >> 4  // делим Value на 16
    a = d % 16  // остаток от деления на 16
    d = q       // d — новое значение делимого
    Result = HEX[a] + Result
  }
  while (q > 0)
  if (Result.length == 1)  // если преобразованное значение состоит из одной цифры
    Result = '0' + Result  // добавляем "0" слева от полученного значения
  Len = Result.length
  if (Digits !== undefined)  // если параметр Digits -- задан (не равен undefine)
    if ((Digits > 2) && (Len < Digits)) {
      d = Digits - Len
      for (a = 1; a <= d; a++)
        Result = '0' + Result
    }
  return Result
}

/*** Разбор RGB-строки, типа "RGB(255, 0, 255)" и выдача строки, типа "#FF00FF" ***/
function parseRGB(value) {
  // Если строка не типа "RGB(255, 0, 255)", то "на выход"
  if (value.match(/^RGB\([0-9]{0,3},\s[0-9]{0,3},\s[0-9]{0,3}\)$/) == null) return value;

var Color;
  Color = value.replace(/[^\d,]/g, '').split(',');  // разбиваем очищенную строку в массив
  return '#' + Int2Hex_1(Color[0], 2) + Int2Hex_1(Color[1], 2) + Int2Hex_1(Color[2], 2);
}

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

var obj = document.getElementById('tbList');  // ссылка на нашу таблицу

//--[ Украшения ]---------------------------------------------------------------
// Формат {font-weight: bold}; Цена {font-weight: bold; color: green}
var colNumFormat, colNumPrice;  // colNumFormat - номер колонки "Формат", colNumPrice - номер колонки "Цена"
var colHeadCount = obj.rows[0].cells.length;  // число колонок в заголовке таблице (нулевая строка)
// Ищем в заголовке ячейку с соответствующими названиями
for (var i = 0; i < colHeadCount; i++) {
  if (obj.rows[0].cells[i].innerText == 'Формат') colNumFormat = i;
  if (obj.rows[0].cells[i].innerText == 'Цена') colNumPrice = i;
}
// Пробегаем по всей таблице и преукрашиваем её
for (var j = 1; j < obj.rows.length; j++) {  // строки (1..n)
  for (var i = 0; i < obj.rows[j].cells.length; i++) {  // столбцы (1..n)
    if (i == 0) {  // если нулевая ячейка текущей строки, то...
      // У каждого элем. INPUT убераем фокусировку
      obj.rows[j].cells[0].childNodes[0].onclick = function() {
//--[ Тело функции ]------------------------------------------------------------
        var objTR = this.parentNode.parentNode;
        var currTR_Color = (objTR.style.backgroundColor.toUpperCase().charAt(0) == '#') ? objTR.style.backgroundColor.toUpperCase() : parseRGB(objTR.style.backgroundColor.toUpperCase());

        /* Взависимости от состояния checkbox-а, меняем цвет текущей строки таблицы
           ("activeColor": #99FFCC; "pushedColor": #FFCC99) */
        objTR.style.backgroundColor = (currTR_Color == '#FFCC99') ? '#99FFCC' : '#FFCC99';
        this.blur();
      }
//-- End -----------------------------------------------------------------------
      continue;
    }
    obj.rows[j].cells[i].onmousedown = MouseDown;
    // Для колонок "Формат" и "Цена" (colNumFormat+1 — т.к. все строки, кроме нулевой, имеют ячеек на 1 больше)
    if (i == colNumFormat+1) {  // если колонка "Формат", то...
      obj.rows[j].cells[i].style.fontWeight = 'bold';
      obj.rows[j].cells[i].style.color = 'green';
    }
    if (i == colNumPrice+1) {   // если колонка "Цена", то...
      obj.rows[j].cells[i].style.fontWeight = 'bold';
      obj.rows[j].cells[i].style.color = 'blue';
    }
  }
  // Для каждой строки назначаем обработчик событий
  with (obj.rows[j]) {
    onmouseover = MouseEnter;
    onmouseout = MouseLeave;
  }
}

/*** Обработчик события onMouseOver текущей строки ***/
function MouseEnter(event) {
var evt = event ? event : window.event;
var target = evt.target ? evt.target : evt.srcElement;
var objTR = target;  // текущая строка
//alert('target.tagName: ' + target.tagName + '\ntarget:\n' + target.parentNode.tagName)
  for (var i = 0; i < 2; i++)  // ищем элемент TR
    if (objTR.tagName != 'TR') objTR = objTR.parentNode; else break;
  // Если не нашли или это шапка таблицы, то "на выход"
  if (objTR.tagName != 'TR' || objTR.rowIndex == 0) return;
//alert('objTR.rowIndex: ' + objTR.rowIndex)
  var currTR_Color = (objTR.style.backgroundColor.toUpperCase().charAt(0) == '#') ? objTR.style.backgroundColor.toUpperCase() : parseRGB(objTR.style.backgroundColor.toUpperCase());
  // Если checkbox НЕ чекнутый (NOT pushedColor), то меняем цвет текущей строки таблицы на "activeColor"
  if (currTR_Color != '#FFCC99') objTR.style.backgroundColor = '#99FFCC';
}

/*** Обработчик события onMouseOut текущей строки ***/
function MouseLeave(event) {
var evt = event ? event : window.event;
var target = evt.target ? evt.target : evt.srcElement;
var objTR = target;  // текущая строка

  for (var i = 0; i < 2; i++)  // ищем элемент TR
    if (objTR.tagName != 'TR') objTR = objTR.parentNode; else break;
  // Если не нашли или это шапка таблицы, то "на выход"
  if (objTR.tagName != 'TR' || objTR.rowIndex == 0) return;
//alert('objTR.style.backgroundColor: ' + eval(objTR.style.backgroundColor))
  var currTR_Color = (objTR.style.backgroundColor.toUpperCase().charAt(0) == '#') ? objTR.style.backgroundColor.toUpperCase() : parseRGB(objTR.style.backgroundColor.toUpperCase());
  // Если checkbox НЕ чекнутый (NOT pushedColor), то меняем цвет текущей строки таблицы на "defaultColor"
  if (currTR_Color != '#FFCC99') objTR.style.backgroundColor = '#F3F3F3';
}

/*** Обработчик события onMouseDown текущей ячейки ***/
function MouseDown(event) {
var evt = event ? event : window.event;
var target = evt.target ? evt.target : evt.srcElement;
var objTR = target;  // текущая строка
var objInput;  // ссылка на элем. INPUT текущей строки, нулевой ячейки

  for (var i = 0; i < 2; i++)  // ищем элемент TR
    if (objTR.tagName != 'TR') objTR = objTR.parentNode; else break;
  // Если не нашли или это шапка таблицы, то "на выход"
  if (objTR.tagName != 'TR' || objTR.rowIndex == 0) return;
  objInput = objTR.childNodes[0].childNodes[0];

  if (objInput.checked) {  // если checkbox чекнутый, то...
    objInput.checked = false;  // разчекиваем его
    objTR.style.backgroundColor = '#99FFCC';  // меняем цвет текущей строки таблицы на "activeColor"
  }
  else {  // если checkbox НЕ чекнутый, то...
    objInput.checked = true;  // чекаем его
    objTR.style.backgroundColor = '#FFCC99';  // меняем цвет текущей строки таблицы на "pushedColor"
  }
}
</script>
</body>
</html>

правда код сильно вырос из-за того, что FireFox цвет возвращает в RGB-формате. У меня objTR.style.backgroundColor FireFox возвращал как rgb(255, 204, 153). Пришлось придумывать функцию parseRGB для конвертирования RGB в строку типа "#FFCC99".

Остался один вопрос по этому коду (может новый топик завести?):
нужно как-нить упростить рег /^RGB\([0-9]{0,3},\s[0-9]{0,3},\s[0-9]{0,3}\)$/ соответствующий строке типа "RGB(255, 0, 255)"?
Чуствую, что можно как-то упростить (т.к. в скобках 3 числа), но что-то не приходит ничего умного в голову (может потом дойдёт smile).

Автор: krulik 28.1.2006, 11:59
Почему я немогу скачать присоедененный файл!?
Выается ошибка:

Цитата

Эта функция запрещена для Гостей

Автор: Ciber SLasH 28.1.2006, 13:16
Цитата(krulik @ 28.1.2006, 11:59 Найти цитируемый пост)

Почему я немогу скачать присоедененный файл!?

Это случается, если файервол режет куки. Просто когда выкенит на ошибку, там по-моиму есть поле для авторизации. Авторизуйся на той странице ещё раз и получишь файл.
У меня такое постоянно было, потом я полностью отключил "куки-контроль" в своём файере (ZoneAlarm Pro).

Автор: Sardar 28.1.2006, 18:12
Цитата(Ciber SLasH @ 10.11.2005, 01:54 Найти цитируемый пост)
Пришлось придумывать функцию parseRGB для конвертирования RGB в строку типа "#FFCC99".

А зачем? Цвет можно задавать как угодно, #RGB, #RRGGBB, rgb(R, G, B)

В целом можно попроще если вынести стили из кода:

Код
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
      <title>JavaScript :: Ячеки таблицы a.k.a phpMyAdmin</title>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      
<style type="text/css">
    caption {
        font: bold 1.2em Arial, Helvetica;
        color: navy;
    }
    thead {
        font: bold 0.9em sans-serif;
        text-align: center;
        background-color: red;
    }
    table, td, th {
        border: 1px solid black;
        cursor: default;
    }
    table {
        margin-left: auto;
        margin-right: auto;
    }
    th {color: black;}
    
    tr.active td, tr.active.over td {background-color: #FFCC99;} 
    tr.over td, tr.not_active.over td {background-color: #99ffcc;}
    td, tr.not_active td {background-color: #F3F3F3;}    
</style>

<script type="text/javascript">
function setStyleClassName(str, oldc, newc) {
    var ret=str.replace(new RegExp("\\b"+oldc+"\\b", "g"), ' '+newc+' ');
    if(ret == str) ret+=' '+newc;
    return ret;
}

function HighlightTable(obj) {
    // Пробегаем по всей таблице и преукрашиваем её
    for (var j = 1; j < obj.rows.length; j++) { // строки (1..n)
        //может кто хочет чего проинициализировать на строке, можно сейчас
        if(typeof(initTableRow) == 'function') initTableRow(obj.rows[j]);
        obj.rows[j].onmousedown = event_mouse_down;
        obj.rows[j].onmouseover = event_mouse_over;
        obj.rows[j].onmouseout = event_mouse_out;
    }
}
//=============- Простые обработчики событий, занимаються подсветкой -==========
function event_mouse_down(ev) {
    if(this.expHandler) this.expHandler(ev, Boolean(this.active));
    this.className = (this.active)?
        setStyleClassName(this.className,  'active', 'not_active'):
        setStyleClassName(this.className, 'not_active', 'active');
    this.active = !Boolean(this.active);
}
function event_mouse_over() {
    this.className = setStyleClassName(this.className, 'out', 'over');
}
function event_mouse_out() {
    this.className = setStyleClassName(this.className, 'over', 'out');
}

//===========================- Логика -=========================================
//инициализатор строк
function initTableRow(row) {
   var chk=row.getElementsByTagName('input')[0]; //assume checkbox
   row.targetCheckbox = chk;
   row.expHandler = setCheckbox;
   if(chk.checked) {
      row.active = true;
      row.className = setStyleClassName(row.className, 'not_active', 'active');
   }
}
//общая функция устнавливающая чекбокс
function setCheckbox(ev, active) {
   this.targetCheckbox.checked = !active;
}
</script>

</head>

<body>
<table class='defaultColor' id='tbList' cellspacing="0" cellpadding="3">
    <caption>Список исполнителей</caption>
    <colgroup span="3">
    <colgroup>
        <col style="font-weight: bold; color: darkgreen;">
        <col style="font-weight: bold; color: blue;">
        <col>
    <thead>
     <tr><th colspan="2">Группа / Альбом</th><th>Год</th><th>Формат</th><th>Цена</th><th>ID-товара</th></tr>
    </thead>
    <tbody>
     <tr><td><input type="checkbox" /></td><td>Гражданская Оборона "Долгая Счастливая Жизнь"</td><td>2004</td><td>OGG q6</td><td>$1.00</td><td>147852369</td></tr>
        <tr><td><input type="checkbox" /></td><td>PurgeN "Протест Деталей Механизма"</td><td>2004</td><td>OGG q6</td><td>$0.95</td><td>123789456</td></tr>
        <tr><td><input type="checkbox" /></td><td>Наив "Живой И Невредимый"</td><td>2004</td><td>MP3 192kbps CBR</td><td>$0.50</td><td>159753852</td></tr>
    </tbody>
</table>
<script type="text/javascript">
    HighlightTable(document.getElementById('tbList'));
</script>

</body>
</html>

Автор: Ciber SLasH 28.1.2006, 18:26
2Sardar:
Код стал круче, а тока в Опере глючит.
Я на эти грабли тоже наступал. Опера при смене класса у строки таблицы, почему-то глючно её отрисовывает.
Поэтому я в своём 5-варианте не менял клласс у строки, а изменял фон у строки. А для этого пришлось добираться к строке через объект event. Для смены цвета фона я сравнивал цвет фона строки с определённым цветом (в зависимости от события) в 16-чной нотации. Но в Лисе цвета фона как оказалось хранятся в виде rgb(цифра, цифра, цифра), поэтому мне и прешлось написать функцию parseRGB.

Автор: Innuendo 28.1.2006, 23:39
Цитата(Temp @ 9.11.2005, 01:36 Найти цитируемый пост)

Необходимо:
1 - Сделать кнопки "поставить/убрать" галочки во всех чекбоксах.
2 - При наведении на строку строка подсвечивается <tr bgcolor=#color_1>
3 - При клине на строке или чекбоксе ставится галочка
4 - Если чекбокс активен строка подсвечивается <tr bgcolor=#color_2>

не знаю, что такое phpMyAdmin, но такую табличку я щас простроил.
при наведени меняется цвет, при отведении обратно. При клике меняется цвет на цвет "выделения" и при наведении на выделенный элемент меняется на другой цвет. Ну 4 цвета короче.
Скрипт проверил в IE 6.0 и Mozilla 1.5. Работает.
скрипт не совсем обычный...
Код

<HTML>
<HEAD>
</HEAD>
<body>
<script type="text/javascript">
<!--
 function colorf (p,tr){
 var oncolor
 if (p==1){
 oncolor = document.getElementById(tr.style.backgroundColor).value
 tr.style.backgroundColor=oncolor
 }
 else{
 oncolor = document.getElementById(tr.style.backgroundColor).value
 tr.style.backgroundColor=oncolor
 }
}
function checks(x,flag){
if (flag==0){
if (document.forms['f'].elements[x].checked==false){
document.forms['f'].elements[x].checked=true
} else {
document.forms['f'].elements[x].checked=false
}
}
var myRow = document.getElementById("tab").rows[x]
if (myRow.getAttribute('chosen') == "no")
{
myRow.setAttribute("chosen","yes")
myRow.style.backgroundColor = "lightgreen"
}
else {
myRow.setAttribute("chosen","no")
myRow.style.backgroundColor = "#eef2f7"
}
}
//-->
</script>
<!-- FOR MOzzila //-->
<input type="hidden" value="rgb(223, 230, 239)" id = "rgb(238, 242, 247)">
<input type="hidden" value="rgb(238, 242, 247)" id = "rgb(223, 230, 239)">
<input type="hidden" value="lightgreen" id = "darkseagreen">
<input type="hidden" value="darkseagreen" id = "lightgreen">
<!-- FOR IE //-->
<input type="hidden" value="#dfe6ef" id = "#eef2f7">
<input type="hidden" value="#eef2f7" id = "#dfe6ef">
<form name="f">
<table id ="tab">
<tr chosen="no" style="background:#DFE6EF" onmouseover= "colorf(1,this);" onMouseOut="colorf(0,this)"><td>
<input onclick="checks(0,1)"  type="checkbox"></td><td onclick="checks(0,0)">Test1</td></tr>
<tr chosen="no"  style="background:#DFE6EF" onmouseover= "colorf(1,this);" onMouseOut="colorf(0,this)" ><td>
<input onclick="checks(1,1)"  type="checkbox"></td><td onclick="checks(1,0)">Test2</td></tr>
<tr chosen="no"  style="background:#DFE6EF" onmouseover= "colorf(1,this);" onMouseOut="colorf(0,this)"><td>
<input onclick="checks(2,1)"  type="checkbox"></td><td onclick="checks(2,0)">Test3</td></tr>
<tr chosen="no"  style="background:#DFE6EF" onmouseover= "colorf(1,this);" onMouseOut="colorf(0,this)"><td>
<input onclick="checks(3,1)"  type="checkbox"></td><td onclick="checks(3,0)">Test4</td></tr>
</table>
</form>
</body>
</html>

Автор: Ciber SLasH 29.1.2006, 00:02
2Innuendo:
Не универсально.
А если у тебя будет 100 строк по 100 ячеек, что тоже будешь каждой ячейке прописывать события в разметке?

Автор: Innuendo 29.1.2006, 00:43
Цитата(Ciber SLasH @ 29.1.2006, 00:02 Найти цитируемый пост)

Не универсально.

Данную неуверсальность можно исправить. К примеру через тарджет события...
или же можно данную таблицу вывести через document.write циклом, и там легко будет задать эти параметры

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)