Как правильно чередовать цвет html-строки с помощью javascript в Rails 3?

#javascript #jquery #ruby-on-rails #css #html-table

#javascript #jquery #ruby-on-rails #css #html-таблица

Вопрос:

Я успешно разместил выделение в своей таблице, но проблема заключается в чередовании цвета строки. Цвет строки меняется только после того, как строка выделена. Другими словами, при первой загрузке или обновлении страницы весь цвет строки окрашивается в белый цвет, который используется по умолчанию. Я хочу исправить это таким образом, чтобы при загрузке страницы в первый раз или при ее обновлении цвет уже чередовался. Кстати, для этого я использовал комбинацию JavaScrpt и встроенного ruby.

Вот фрагмент кода для моего index.html.erb :

 <table id="table_list">
 <tr onMouseOver="this.className='highlight'" onMouseOut="this.className='<%= cycle :odd, :even %>'">
  <td> Data 1 </td>
  <td> Data 2 </td>
 </tr>
</table>
  

и на моем CSS:

 <pre>
#table_list{
  border: solid 1px #666;
  border-collapse: collapse;
  margin: 10px 0;
}

#table_list th{
  font-size: 12px;
  color: #FFF;
  background-color: #404C99;
  padding: 4px 8px;
  padding-bottom: 4px;
  text-align: left;
}

#table_list .highlight {
    background-color: yellow;
}

#table_list td {
  font-size: 12px;
  padding: 2px 6px;
}

#table_list .even td {
  background-color: #E3E6FF;
}

#table_list .odd td {
  background-color: #D1D8F6;
}

</pre>
  

Ответ №1:

Вам не нужен onmouseout. используйте css:

 tr:hover {
  background-color: yellow;
}
  

вместо этого. Затем в вашей таблице:

 <table id="table_list">
  <tr class="<%= cycle('odd', 'even') %>">
    <td> Data 1 </td>
    <td> Data 2 </td>
  </tr>
</table>
  

если вы хотите, чтобы он был совместим с IE (я полагаю: наведение курсора не работает на не привязанных элементах в IE), вы можете использовать JS (или jquery для выполнения наведения курсора за вас.

Ответ №2:

Здесь вы можете использовать jQuery для этой цели окрашивания.

Возможно, вам пригодятся селекторы :even и :odd.

Затем вы могли бы использовать их следующим образом (рабочая копия):

Вы можете загрузить jquery с jquery.com

     <style>
        #table_list .even td
        {
            background-color: #E3E6FF;
        }
        #table_list .odd td
        {
            background-color: #D1D8F6;
        }
        #table_list td.hover
        {
            background-color: green !important;
        }
    </style>

    <script language="javascript">

        $(document).ready(function() {

            $('#table_list').find('tr>td').hover(function() {
                //$(this).css("background-color", "green");
                $(this).addClass('hover');
            }, function() {
                //$(this).css("background-color", "inherit");
                $(this).removeClass('hover');
            });
            $('#table_list  tr:even').addClass('even');
            $('#table_list tr:odd').addClass('odd');

        });



    </script>

    <body>
        <form id="form2">
        <div>
            <table id="table_list">
                <tr>
                    <td>
                        1
                    </td>
                    <td>
                        Babu
                    </td>
                </tr>
                <tr>
                    <td>
                        2
                    </td>
                    <td>
                        Satheesh
                    </td>
                </tr>
                <tr>
                    <td>
                        3
                    </td>
                    <td>
                        Ramesh
                    </td>
                </tr>
                <tr>
                    <td>
                        4
                    </td>
                    <td>
                        Venki
                    </td>
                </tr>
                <tr>
                    <td>
                        5
                    </td>
                    <td>
                        Abhishek
                    </td>
                </tr>
            </table>
        </div>
        </form>
  

Ответ №3:

Задайте начальный класс.

 <table id="table_list">
 <tr class='<%= cycle :even, :odd %>' onMouseOver="this.className='highlight'" onMouseOut="this.className='<%= cycle :odd, :even %>'">
  <td> Data 1 </td>
  <td> Data 2 </td>
 </tr>
</table>
  

Комментарии:

1. то же самое… Я это уже пробовал… Он преобразует цвет фона в #D1D8F6. Он больше не чередуется.

2. Я не знаю синтаксиса Ruby, но предпосылка заключается в том, что вы хотите установить «class» равным тому, что установлено в onmouseout. Я предполагаю, что команда cycle теперь будет циклически повторяться дважды для каждой строки, в результате чего каждая строка будет иметь один и тот же класс и один и тот же (противоположный) onmouseout . Исправит ли это изменение одного из циклов путем переключения порядка? В противном случае вам, возможно, придется использовать решение javascript для сохранения класса строки, прежде чем устанавливать для него значение «выделить».

3. @johan, посмотри на созданный исходный код HTML / javascript, и ты поймешь, что происходит… всегда.

Ответ №4:

Используйте n-й дочерний элемент jQuery. Предполагая, что мы хотим чередовать теги li, мы делаем следующее.

 $('#test li:nth-child(odd)').addClass('odd');
  

Вы можете сделать то же самое для вашего td или любого другого элемента.

Проверьте рабочий пример на http://jsfiddle.net/T4Ywt/1 /

Комментарии:

1. если вы можете использовать :nth-child(нечетный) для обозначения нечетных строк таблицы в CSS, то вам не нужно вызывать addClass(‘нечетный’). Проблема уже решена.

Ответ №5:

@johan, причина, по которой ваш код не работает, заключается в том, что код Ruby, который выполняет циклическое переключение между четным и нечетным, запускается только один раз, при загрузке страницы. Если вы загрузитесь index.html , а затем посмотрите на исходный код в своем браузере, вы увидите что-то вроде:

 ...
 <tr onMouseOver="this.className='highlight'" onMouseOut="this.className='odd'">
...
  

Комментарии:

1. Да.. Это то, что я вижу… Как я собираюсь это исправить? Я пробовал другие ответы, но я не могу заставить это работать.

Ответ №6:

Эта задача стала намного проще с CSS3, который добавил псевдоселекторы :nth-child().

 tr:nth-child(even) {
    background-color: #E3E6FF; 
}

tr:nth-child(odd) {
    background-color: #D1D8F6; 
}
  

Теперь вам не нужно устанавливать класс для строк вашей таблицы, просто оформляйте четные и нечетные строки по отдельности. Для этого не нужны Rails или вызовы jQuery, а CSS-решение автоматически обрабатывает изменения структуры таблицы.