Показать / Скрыть строки таблицы с помощью классов Javascript
у меня есть таблица, которая расширяется и сворачивается, но она становится слишком грязной, чтобы использовать ее, а IE и Firefox не работают с ней должным образом.
Итак, вот код:
function toggle_it(itemID){
// Toggle visibility between none and ''
if ((document.getElementById(itemID).style.display == 'none')) {
document.getElementById(itemID).style.display = ''
event.preventDefault()
} else {
document.getElementById(itemID).style.display = 'none';
event.preventDefault()
}
}
и пример HTML:
<table>
<tr>
<td>Product</td>
<td>Price</td>
<td>Destination</td>
<td>Updated on</td>
</tr>
<tr>
<td>Oranges</td>
<td>100</td>
<td><a href="#" id="toggle" onClick="toggle_it('tr1');toggle_it('tr2')">+ On Store</a></td>
<td>22/10</td>
</tr>
<tr id="tr1" style="display:none">
<td></td>
<td>120</td>
<td>City 1</td>
<td>22/10</td>
</tr>
<tr id="tr2" style="display:none">
<td></td>
<td>140</td>
<td>City 2</td>
<td>22/10</td>
</tr>
<tr>
<td>Apples</td>
<td>100</td>
<td><a href="#" id="toggle" onClick="toggle_it('tr3');toggle_it('tr4')">+ On Store</a></td>
<td>22/10</td>
</tr>
<tr id="tr3" style="display:none">
<td></td>
<td>120</td>
<td>City 1</td>
<td>22/10</td>
</tr>
<tr id="tr4" style="display:none">
<td></td>
<td>140</td>
<td>City 2</td>
<td>22/10</td>
</tr>
</table>
проблема в том, что я использую один идентификатор для каждого, и это очень раздражает, потому что я хочу иметь много скрытых строк для каждого родителя и много родителей, поэтому было бы слишком много идентификаторов для обработки. И IE и FireFox только показывает первый скрытый ряд, а не другие. Я подозреваю, что это происходит потому, что я заставил его работать, вызвав все идентификаторы вместе. Я думаю, было бы лучше использовать классы вместо идентификаторов для индетификации скрытых строк.
Я действительно Новичок во всем этом, поэтому, пожалуйста, попробуйте объяснить это любым простым способом. Также я пробовал jQuery, но не смог его получить.
6 ответов
трудно понять, что вы пытаетесь сделать с этим образцом, но вы на самом деле на правильном пути, думая об использовании классов. Я создал JSFiddle, чтобы продемонстрировать немного лучший способ (я надеюсь) сделать это.
вот скрипку: ссылке.
вместо работы с идентификаторами вы работаете с классами. В вашем примере кода, есть апельсины и яблоки. Я рассматриваю их как категории продуктов (поскольку я действительно не знайте, какова ваша цель), со своими собственными идентификаторами. Итак, я отмечаю продукт <tr>
С class="cat1"
или class="cat2"
.
я также отмечаю ссылки простым .toggler
класса. Это не хорошая практика, чтобы иметь onclick
атрибуты на самих элементах. Вы должны привязать события при загрузке страницы с помощью JavaScript. Я делаю это с помощью jQuery.
$(".toggler").click(function(e){
// you handle the event here
});
в этом формате вы привязываете обработчик событий к click
событие ссылок с классом toggler
. В моем коде я добавляю data-prod-cat
атрибут toggler
ссылки, чтобы указать, какие строки продукта они должны контролировать. (Причина моего использования объясняется здесь. Вы можете Google "html5 атрибуты данных" для получения дополнительной информации.)
в обработчике событий, я делаю это:
$('.cat'+$(this).attr('data-prod-cat')).toggle();
С этим кодом я на самом деле пытаюсь создать селектор, как $('.cat1')
поэтому я могу выбрать строки для определенной категории продуктов и изменить их видимость. Я использую $(this).attr('data-prod-cat')
это для доступа the data-prod-cat
атрибут ссылки, которую пользователь нажимает. Я использую jQuery тумблер функция, так что мне не нужно писать логику, как if visible, then hide element, else make it visible
как вы в JS коде. этим занимается jQuery. Функция переключения делает то, что она говорит и toggle
s видимость указанного элемента(элементов).
я надеюсь, это было достаточно объяснительной.
Ну один из способов сделать это было бы просто поместить класс в" родительские " строки и удалить все идентификаторы и встроенные onclick
атрибуты:
<table id="products">
<thead>
<tr>
<th>Product</th>
<th>Price</th>
<th>Destination</th>
<th>Updated on</th>
</tr>
</thead>
<tbody>
<tr class="parent">
<td>Oranges</td>
<td>100</td>
<td><a href="#">+ On Store</a></td>
<td>22/10</td>
</tr>
<tr>
<td></td>
<td>120</td>
<td>City 1</td>
<td>22/10</td>
</tr>
<tr>
<td></td>
<td>140</td>
<td>City 2</td>
<td>22/10</td>
</tr>
...etc.
</tbody>
</table>
а затем есть CSS, который скрывает всех не-родителей:
tbody tr {
display : none; // default is hidden
}
tr.parent {
display : table-row; // parents are shown
}
tr.open {
display : table-row; // class to be given to "open" child rows
}
это значительно упрощает ваш html. Обратите внимание, что я добавил <thead>
и <tbody>
в разметку, чтобы сделать его легко скрыть строки данных и игнорировать строки заголовка.
С jQuery вы можете просто сделать это:
// when an anchor in the table is clicked
$("#products").on("click","a",function(e) {
// prevent default behaviour
e.preventDefault();
// find all the following TR elements up to the next "parent"
// and toggle their "open" class
$(this).closest("tr").nextUntil(".parent").toggleClass("open");
});
демо: http://jsfiddle.net/CBLWS/1/
или, чтобы реализовать что-то подобное в обычном JavaScript, возможно, что-то вроде следующего:
document.getElementById("products").addEventListener("click", function(e) {
// if clicked item is an anchor
if (e.target.tagName === "A") {
e.preventDefault();
// get reference to anchor's parent TR
var row = e.target.parentNode.parentNode;
// loop through all of the following TRs until the next parent is found
while ((row = nextTr(row)) && !/\bparent\b/.test(row.className))
toggle_it(row);
}
});
function nextTr(row) {
// find next sibling that is an element (skip text nodes, etc.)
while ((row = row.nextSibling) && row.nodeType != 1);
return row;
}
function toggle_it(item){
if (/\bopen\b/.test(item.className)) // if item already has the class
item.className = item.className.replace(/\bopen\b/," "); // remove it
else // otherwise
item.className += " open"; // add it
}
демо:http://jsfiddle.net/CBLWS/
в любом случае, поместите JavaScript в <script>
элемент, который находится в конце тела, так что он запускается после того, как таблица была проанализирована.
JQuery 10.1.2 имеет хорошие функции show и hide, которые инкапсулируют поведение, о котором вы говорите. Это избавит вас от необходимости писать новую функцию или отслеживать классы CSS.
$("tr1").show();
$("tr1").hide();
event.preventDefault()
не работает во всех браузерах. Вместо этого вы можете вернуть false в событии OnClick.
onClick="toggle_it('tr1');toggle_it('tr2'); return false;">
не уверен, что это лучший способ, но я тестировал в IE, FF и Chrome и работал нормально.
ниже мой скрипт, который показывает / скрывает строку таблицы с идентификатором "agencyrow".
<script type="text/javascript">
function showhiderow() {
if (document.getElementById("<%=RadioButton1.ClientID %>").checked == true) {
document.getElementById("agencyrow").style.display = '';
} else {
document.getElementById("agencyrow").style.display = 'none';
}
}
</script>
просто вызов функции showhiderow()
по радиокнопкой onClick
событие
директивы AngularJS ng-show, ng-hide позволяют отображать и скрывать строку:
<tr ng-show="rw.isExpanded">
</tr>
строка будет видна, когда rw.isExpanded = = true и скрыто, когда РВ.isExpanded = = false. ng-hide выполняет ту же задачу, но требует обратного условия.