Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   поиск элементов dom (https://javascript.ru/forum/css-html/39817-poisk-ehlementov-dom.html)

vladislav.blinov 13.07.2013 09:15

поиск элементов dom
 
Всем привет столкнулся с такой проблемой у меня есть таблица которая формируется циклом и группируется по дате. В зависимости от даты мне нужно скрывать/отображать строки. выглядит след образом:
<table>
	<tr class="date_01_07_2013"><td>01.07.2013(Это основное поле на котором кнопка скрыть/отобразить)</td></tr>
	<tr class="dt01_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt01_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt01_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	.....и так на каждую дату
	<tr class="date_31_07_2013"><td>31.07.2013</td></tr>
	<tr class="dt31_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt31_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt31_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
</table>

чтобы скрывать/отображать поля я решил присваивать tr классу display = 'none';/display = 'table-row'; написал вот такой скрипт
function close(){
var divs=document.getElementsByTagName("TR");
for( var i=0; i<divs.length; i++)
   if(divs[i].className=="dt01.07.2013")
     divs[i].style.display = 'none';
}
                
 function open(){
var divs=document.getElementsByTagName("TR");
for( var i=0; i<divs.length; i++)
   if(divs[i].className=="dt01.07.2013")
     divs[i].style.display = 'table-row';
}

а в цикл к главному окну с датой добавил
<i class="icon-min" onclick="clos()"></i>
            <i class="icon-max" onclick="open()"></i>

в итоге получилось скрывать и отображать только первое число а чтобы скрывать и отображать остальные мне нужно скопировать скрипт 60 раз и менять только className и имя функции

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

рони 13.07.2013 09:48

vladislav.blinov,
вытаскиваем класс парента date_01_07_2013 убираем te_ получаем нужный класс -- 2 функции на все строки

vladislav.blinov 13.07.2013 10:02

<tr class="date_01_07_2013"><i class="icon-min" onclick="clos1()"></i>
            <i class="icon-max" onclick="open1()"></i><td>01.07.2013</td></tr>

<tr class="date_02_07_2013"><i class="icon-min" onclick="clos2()"></i>
            <i class="icon-max" onclick="open2()"></i><td>01.07.2013</td></tr>

.....
верхняя строка всегда отображена скрываются только те строки которые сгруппированы по этой дате если вытащить один общий клас то будут скрываться все поля а не по датам.

danik.js 13.07.2013 10:18

vladislav.blinov, можно группировать строки с одной датой в <tbody> секции, чтобы не парсить дату можно добавить дополнительный data-* атрибут типа data-date="тут дата"

vladislav.blinov 13.07.2013 10:38

Цитата:

Сообщение от danik.js (Сообщение 262027)
vladislav.blinov, можно группировать строки с одной датой в <tbody> секции, чтобы не парсить дату можно добавить дополнительный data-* атрибут типа data-date="тут дата"

переименовывать классы нельзя группировать тоже не получается уже пробовал.

рони 13.07.2013 11:12

Цитата:

Сообщение от vladislav.blinov
верхняя строка всегда отображена скрываются только те строки которые сгруппированы по этой дате если вытащить один общий клас то будут скрываться все поля а не по датам.

моя твоя непонимай ...

кликайте по датам ... оно ?
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<table>
	<tr class="date_01_07_2013"><td>01.07.2013</td></tr>
	<tr class="dt01_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt01_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt01_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="date_31_07_2013"><td>31.07.2013</td></tr>
	<tr class="dt31_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt31_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt31_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
</table>
<script>
var trs = document.getElementsByTagName("TR");
for (var i = 0; i < trs.length; i++) {
    var c = trs[i].className;
    if (/^date_/.test(c)) {
        trs[i].onclick = function () {
            var c = this.className.replace('ate_', 't');
            for (var k = 0; k < trs.length; k++) {
                if (c == trs[k].className) {
                    var display = trs[k].style.display
                    trs[k].style.display = display != 'none' ? 'none' : 'table-row'
                }
            }
        }
     trs[i].onclick() //можно убрать или открыть первую дату => i && (trs[i].onclick())
    }
}
</script>
</body>
</html>

vladislav.blinov 13.07.2013 12:05

Цитата:

Сообщение от рони (Сообщение 262036)
моя твоя непонимай ...

оно только не могу разобраться в скрипте, как он работает и как привязан к датам, можешь в общих чертах объяснить?

рони 13.07.2013 12:31

vladislav.blinov,
в общих чертах уже во 2 посте только 1 функция на всё - обходим все строки - если класс начинается на date
ставим такой строке реагирование на клик -- который обходит все строки и ищет нужный класс -- который получаем из класса строки методом replace и ставит display в нужную нам позицию

vladislav.blinov 13.07.2013 12:44

Цитата:

Сообщение от рони (Сообщение 262048)
vladislav.blinov,
в общих чертах уже во 2 посте только 1 функция на всё - обходим все строки - если класс начинается на date
ставим такой строке реагирование на клик -- который обходит все строки и ищет нужный класс -- который получаем из класса строки методом replace и ставит display в нужную нам позицию

Спасибо подход хороший, только мне обязательно нужна кнопка по которой нужно щёлкать открыть/закрыть. Можно как нибудь привязать это фунукцию не к дате а к онклик с классом строк которые нужно свернуть?

рони 13.07.2013 13:00

Цитата:

Сообщение от vladislav.blinov
Можно как нибудь привязать это фунукцию не к дате а к онклик с классом строк которые нужно свернуть?

непонимаю -- а привязать можно к чему угодно

vladislav.blinov 13.07.2013 13:27

Цитата:

Сообщение от рони (Сообщение 262050)
непонимаю -- а привязать можно к чему угодно

я пытаюсь реализовать что то вроде этого:
function close(нужные классы){
var trs=document.getElementsByTagName("TR");
for( var i=0; i<екы.length; i++)
   if(trs.className==нужные классы)
     trs.style.display = 'none';
}


а потом в первое поле где date_01_07_2013 вставить ссылку
<a href="javascript:close(dt01_07_2013)">показать поле</a>

но вот всё никак не выходит:(

рони 13.07.2013 14:08

vladislav.blinov,
что мешает в код который я дал добавить вашу кнопку

vladislav.blinov 13.07.2013 14:12

мешают только знания точнее их отсутствие) если не трудно напиши пример кнопки.

рони 13.07.2013 14:27

vladislav.blinov,
<!DOCTYPE HTML>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
 a{
   margin-left: 10px
 }

  </style>
</head>

<body>
<table>
	<tr class="date_01_07_2013"><td>01.07.2013</td></tr>
	<tr class="dt01_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt01_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt01_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="date_31_07_2013"><td>31.07.2013</td></tr>
	<tr class="dt31_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt31_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
	<tr class="dt31_07_2013">
		<td>имя</td>
		<td>фамилия</td>
	</tr>
</table>
<script>
for (var a = document.getElementsByTagName("TR"), b = 0; b < a.length; b++) {
    var d = a[b],
        e = d.className;
    if (/^date_/.test(e)) {
        var e = e.replace("ate_", "t"),
            f = document.createElement("a");
        f.appendChild(document.createTextNode("\u0441\u043a\u0440\u044b\u0442\u044c"));
        d.cells[0].appendChild(f);
        f.href = "#";
        f.onclick = function (g) {
            return function () {
                this.textContent =  this.textContent ==  "\u0441\u043a\u0440\u044b\u0442\u044c" ?  "\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c" : "\u0441\u043a\u0440\u044b\u0442\u044c" ;
                for (var c = 0; c < a.length; c++) g == a[c].className && (a[c].style.display = "none" != a[c].style.display ? "none" : "table-row");
                return !1
            }
        }(e);
        f.onclick()
    }
};
</script>
</body>
</html>

vladislav.blinov 13.07.2013 14:46

спасибо за помощь :thanks:
но я никак не могу разобраться в этих строчках
if (/^date_/.test(e)) {
	        var e = e.replace("ate_", "t"),

получается он в первой tr ищет строчку date_ потом делает replace и превращает строку из date_ в dt
но если в первой tr будет class="date_tr date_01_07_2013"
и по логике поменять код на
if (/^date_tr.date_/.test(e)) {
	        var e = e.replace("ate_tr.date_", "t"),

то он должен работать как и было но он начинает работать наоборот т.е. скрывает первую tr (сам себя) что я написал не правильно?

рони 13.07.2013 14:53

vladislav.blinov,
задача была с одним классом из date_31_07_2013 получаем dt31_07_2013 если классов много решается иначе например методом job

vladislav.blinov 13.07.2013 15:01

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

рони 13.07.2013 15:11

vladislav.blinov,
читайте про RegExp меняйте /^date_/ и var e = e.replace("ate_", "t"),
и если необходимо g == a[c].className на if (/class(условно)/.test(a[c].className))


Часовой пояс GMT +3, время: 04:10.