2008-09-09 7 views
10

Как я могу использовать библиотеку Prototype и создавать ненавязчивый javascript для ввода событий onmouseover и onmouseout в каждую строку, вместо того, чтобы помещать javascript в каждый тег строки таблицы?Как я могу выделить строку таблицы с использованием Prototype?

Ответ на использование библиотеки Prototype (вместо mootools, jQuery и т. Д.) Был бы наиболее полезен.

ответ

9
<table id="mytable"> 
    <tbody> 
     <tr><td>Foo</td><td>Bar</td></tr> 
     <tr><td>Bork</td><td>Bork</td></tr> 

    </tbody> 
</table> 

<script type="text/javascript"> 

$$('#mytable tr').each(function(item) { 
    item.observe('mouseover', function() { 
     item.setStyle({ backgroundColor: '#ddd' }); 
    }); 
    item.observe('mouseout', function() { 
     item.setStyle({backgroundColor: '#fff' }); 
    }); 
}); 
</script> 
+0

Очень круто. Я не знал, что вы можете делать такие вещи, как $$ ('# mytable tr'). Это делает мою жизнь намного легче. – 2008-09-09 16:09:20

+1

Код @swilliams лучше моего примера, но я думаю, вы должны использовать addClassName(), а не явно задавать стиль в JS. – pix0r 2008-09-09 16:11:58

+0

@Mark Biek, есть куча помощников, таких как $ F и $ A. См. Служебную страницу: http://www.prototypejs.org/api/utility и Перечислимые объекты очень мощные: http://www.prototypejs.org/api/enumerable – swilliams 2008-09-09 16:14:55

7

Вы можете использовать методы прототипа addClassName и removeClassName.

Создайте класс CSS «hilight», который вы примените к hilighted <tr>. Затем запустите этот код на странице загрузки:

var rows = $$('tbody tr'); 
for (var i = 0; i < rows.length; i++) { 
    rows[i].onmouseover = function() { $(this).addClassName('hilight'); } 
    rows[i].onmouseout = function() { $(this).removeClassName('hilight'); } 
} 
1

Вы можете сделать что-то к каждой строке, например:

$('tableId').getElementsBySelector('tr').each(function (row) { 
    ... 
}); 

Таким образом, в теле этой функции, вы имеете доступ к каждому строка, по одному в переменной «row». Затем можно вызвать Event.observe (строка, ...)

Так, что-то подобное может работать:

$('tableId').getElementsBySelector('tr').each(function (row) { 
    Event.observe(row, 'mouseover', function() {...do hightlight code...}); 
}); 
2

Я сделал небольшое изменение в @swilliams кода.

$$('#thetable tr:not(#headRow)').each(

Это позволяет мне иметь таблицу со строкой заголовка, не получить выделенный.

<tr id="headRow"> 
    <th>Header 1</th> 
</tr> 
3

Немного общее решение:

Скажем, я хочу иметь простой способ сделать таблицы с рядами, которые выдвигают на первый план, когда я поставил указатель мыши над ними. В идеальном мире это было бы очень легко, только с одним простым правилом CSS:

tr:hover { background: red; } 

К сожалению, более старые версии IE не поддерживают селектор: парить на других, чем A. элементов Таким образом, мы должны использовать JavaScript.

В этом случае я определяю класс таблицы «highlightable», чтобы отмечать таблицы, которые должны иметь парирующие строки. Я сделаю переключение фона, добавив и удалив класс «выделить» в строке таблицы.

CSS

table.highlightable tr.highlight { background: red; } 

JavaScript (с помощью прототипа)

// when document loads 
document.observe('dom:loaded', function() { 
    // find all rows in highlightable table 
    $$('table.highlightable tr').each(function(row) { 
     // add/remove class "highlight" when mouse enters/leaves 
     row.observe('mouseover', function(evt) { evt.element().addClassName('highlight') }); 
     row.observe('mouseout', function(evt) { evt.element().removeClassName('highlight') }); 
    }); 
}) 

HTML

Все, что вам нужно сделать сейчас, чтобы добавить класс "highlightable" любому таблицу, которую вы хотите:

<table class="highlightable"> 
    ... 
</table> 
0

Я нашел ab интересное решение для фона Rows, строки, выделенные на мыши, без JS.Вот link

Работает во всех браузерах. Для IE6/7/8 ...

tr{ position: relative; } 
td{ background-image: none } 

И для Safari я использую отрицательное положение фона для каждого TD.