Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как получить количество <DIV> на странице?
 
 автор: kukuikar   (22.02.2007 в 02:13)   письмо автору
 
 

Мне нужно:
1. Получить в функцию JS кол-во дивов на странице. Их всегда разное количество, генерируются из PHP.
2. В функции отображения скрытия <DIV> передается <DIV> , который надо отобразить. Надо перебрать все <DIV> и назначить им свойство display: none, кроме того который передается в функцию для отображения.

Заранее спасибо.

   
 
 автор: retsoul   (22.02.2007 в 02:36)   письмо автору
 
   для: kukuikar   (22.02.2007 в 02:13)
 

если требуется отображать 1 див 2, 3 ... н - дивов, то не проще, тем которые надо отображать присвоить один класс? и в стилях назначить ему свойство display:block; а всем дивам задать display:none?

   
 
 автор: kukuikar   (22.02.2007 в 02:40)   письмо автору
 
   для: retsoul   (22.02.2007 в 02:36)
 

Немного неверно сформулировал я.
Должен быть виден только один див. При нажатии ссылки "Показать" предыдущий должен закрыться. Хм. Тогда мне нужен ID предыдущего элемента. Что-то где-то слышал....

   
 
 автор: retsoul   (22.02.2007 в 02:46)   письмо автору
 
   для: kukuikar   (22.02.2007 в 02:40)
 

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

   
 
 автор: kukuikar   (22.02.2007 в 02:52)   письмо автору
 
   для: retsoul   (22.02.2007 в 02:46)
 

Уже нараздавал.
Теперь надо как-то получить ID предыдущего открытого дива.
Вот моя функция сокрытия/отображения:

function openClose(div_id) {
if (document.getElementById(div_id).style.display == 'none')
    {
    document.getElementById(div_id).style.display = 'block';
    document.getElementById('stat'+div_id).innerText ="Скрыть описание";
    } 
else 
    {
    document.getElementById(div_id).style.display = 'none';
    document.getElementById('stat'+div_id).innerText ="Показать описание";
    } 
}


Я не очень хорошо владею JS, поэтому наверное грубовато...

   
 
 автор: retsoul   (22.02.2007 в 02:57)   письмо автору
 
   для: kukuikar   (22.02.2007 в 02:52)
 

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

   
 
 автор: kukuikar   (22.02.2007 в 02:59)   письмо автору
 
   для: retsoul   (22.02.2007 в 02:57)
 

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

Как же мне закрыть предыдущий открытый див?

   
 
 автор: retsoul   (22.02.2007 в 03:12)   письмо автору
 
   для: kukuikar   (22.02.2007 в 02:59)
 

дело в том, что ай-ди-шки у дивов разные, поэтому в этой функции потребуется дополнительная глобальная переменная, в которую будет сохраняться ай-ди открывающего дива, то есть присвоение ей значения будет в том блоке, где "дисплею" присваиваем значени "блок", а для закрытия открытого потребуется блок с обращением к этой глобальной переменной и всё, для исключения внештатных ситуаций можно назначить этой переменной значение - none, а при вызове закрывающей функции проверять на неравность дефалтовому значению, но это так, перестраховка :)

   
 
 автор: CNT   (22.02.2007 в 07:30)   письмо автору
 
   для: kukuikar   (22.02.2007 в 02:13)
 

function f (x)
{//x - тот самый <DIV>, который надо единственным отобразить
for (var obj = document.getElementsByTagName ('DIV'), j = 0; j < obj.length; j++)
obj [j].style.display = 'none';
x.style.display = 'block'; //если <DIV> передается функции как ОБЪЕКТ
//или
document.getElementsById [x].style.display = 'block'; //если функции передается только ID <DIV>'a
}

   
 
 автор: kukuikar   (22.02.2007 в 08:44)   письмо автору
 
   для: CNT   (22.02.2007 в 07:30)
 

Спасибо. Только фцнкция скрывает все дивы.
Мне надо оставить видимыми всн дивы с именем 'stat'+x, в данном случае.

Проверка

obj [j].name != 'stat'+x

непомогает.

Я думаю вставить в свою функцию во эти строки:


for (var obj = document.getElementsByTagName ('DIV'), j = 0; j < obj.length; j++) 
    {
    if (obj.[j].name != 'stat'+div_id)
        {
        obj [j].style.display = 'none';
        }
    }
    

Только непомогает она, разве у объекта document.getElementsByTagName ('DIV') нет свойства name?

   
 
 автор: CNT   (22.02.2007 в 14:22)   письмо автору
 
   для: kukuikar   (22.02.2007 в 08:44)
 

1. getElementsByTagName ('DIV') - это, вообще-то, метод, который возвращает коллекцию <DIV>'ов

2. каждый элемент коллекции getElementsByTagName ('DIV') является, собственно, <DIV>'ом, который вообще-то, по умолчанию НЕ ИМЕЕТ атрибута name. Атрибут name является неотъемлемым (sic!) свойством объектов: FRAME, FRAMESET, IFRAME, WINDOW, META, A, APPLET, BUTTON, EMBED, FORM, IMG, INPUT type=button, INPUT type=checkbox, INPUT type=file, INPUT type=hidden, INPUT type=image, INPUT type=password, INPUT type=radio, INPUT type=reset, INPUT type=submit, INPUT type=text, LINK, MAP, OBJECT, RT, RUBY, SELECT, TEXTAREA. Как видите, объекта DIV в данном списке нет.

3. вам предложен вариант, в котором (допустим) 20-ть имеющихся <DIV>'ов будут "спрятаны" и затем один из только что "спрятанных" откроется. Итого - 21-а операция.
Вы хотите 20-ть раз проверять и после проверки 19-ть раз "прятать" и один раз - "показывать". Итого - 40-к операций.
Полагаю, что мой способ значительно... рентабельнее.

4. как вижу, вы передаёте функции в качестве параметра строковую переменную x, содержащую часть атрибута name <DIV>'а, который следует единственным показать.
Тогда вам надо:
a) PHP-скриптом назначить для <DIV>'ов все же не имена (name), а идентификаторы (ID);
b) три последние строки функции, кою я прописал выше
x.style.display = 'block'; //если <DIV> передается функции как ОБЪЕКТ
//или
document.getElementsById [x].style.display = 'block'; //если функции передается только ID <DIV>'a

заменить на одну
document.getElementsById ['stat' + x].style.display = 'block';

   
 
 автор: CNT   (22.02.2007 в 19:24)   письмо автору
 
   для: CNT   (22.02.2007 в 14:22)
 

Ну и, напоследок, вариант с максимальным КПД, т.е. функция будет "прятать" только один (показываемый к тому времени) <DIV> и отображать новый. Т.е. всего 2 (две) операции.
Для этого:

a) между <head> и </head> должна быть прописана глобальная переменная:
<script>
var GlobalX;
</script>


b) все формируемые PHP-скриптом <DIV>'ы должны иметь style="display: none"; можно использовать между <head> и </head> конструкцию
<style>
div {display: none}
</style>


c) передавать функции при клике на ссылку вы так и будете часть идентификатора.
function f (x)
{
if (self.GlobalX) GlobalX.style.display = 'none';
document.getElementsById ['stat' + x].style.display = 'block';
GlobalX = document.getElementsById ['stat' + x];
}

   
 
 автор: kukuikar   (23.02.2007 в 19:21)   письмо автору
 
   для: CNT   (22.02.2007 в 19:24)
 

CNT
Спасибо огромное. Все получилось, только getElementById с круглыми скобками, а не с квадратными. Сразу не заметил и мучался, почему он ругается на getElementById.



function f(x) 

if (self.GlobalX)
    GlobalX.style.display = 'none';
     
document.getElementById(x).style.display = 'block'; 
GlobalX = document.getElementById(x); 



А что сделать чтобы при одном щелчке див раскрывался, а при следующем щелчке прятался?

Сделал так:
function f(x) 

if (self.GlobalX)
    GlobalX.style.display = 'none';

if (document.getElementById(x) == GlobalX)
    {
    document.getElementById(x).style.display = 'none';
    document.getElementById('stat'+x).innerText ="Показать описание";
    }
else     
    {
    document.getElementById(x).style.display = 'block'; 
    document.getElementById('stat'+x).innerText ="Скрыть описание";
    }
    
GlobalX = document.getElementById(x); 
}  


Только немного не так как надо работает..
При 1 щелчке раскрывается, при следующем прячется, а при последующих не раскрывается.
Понятно что после 2 щелчка условие (document.getElementById(x) == GlobalX) выполняется и он не показыват его. чего-то немогу решить это...

   
 
 автор: CNT   (23.02.2007 в 19:56)   письмо автору
 
   для: kukuikar   (23.02.2007 в 19:21)
 

1. по квадратным скобкам - верно, лажанулся я

2. попробуйте так:
function f (x) 

if (self.GlobalX) GlobalX.style.display = 'none';

if (self.GlobalX && document.getElementById (x) == GlobalX)
   {
   document.getElementById ('stat' + x).innerText = "Показать описание";
   GlobalX = null;
   }
else     
   {
   document.getElementById (x).style.display = 'block'; 
   document.getElementById ('stat' + x).innerText = "Скрыть описание";
   GlobalX = document.getElementById (x);
   }
}

   
 
 автор: kukuikar   (23.02.2007 в 21:17)   письмо автору
 
   для: CNT   (23.02.2007 в 19:56)
 


Все превосходно работает. Огроменное спасибо. 

Теперь буду делать чтобы ДИВ медленно раскрывался вниз, и сворачивался вверх. Это я на этом форуме видел, попробую сам. Но если что.... :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования