|
|
|
| Мне нужно:
1. Получить в функцию JS кол-во дивов на странице. Их всегда разное количество, генерируются из PHP.
2. В функции отображения скрытия <DIV> передается <DIV> , который надо отобразить. Надо перебрать все <DIV> и назначить им свойство display: none, кроме того который передается в функцию для отображения.
Заранее спасибо. | |
|
|
|
|
|
|
|
для: kukuikar
(22.02.2007 в 02:13)
| | если требуется отображать 1 див 2, 3 ... н - дивов, то не проще, тем которые надо отображать присвоить один класс? и в стилях назначить ему свойство display:block; а всем дивам задать display:none? | |
|
|
|
|
|
|
|
для: retsoul
(22.02.2007 в 02:36)
| | Немного неверно сформулировал я.
Должен быть виден только один див. При нажатии ссылки "Показать" предыдущий должен закрыться. Хм. Тогда мне нужен ID предыдущего элемента. Что-то где-то слышал.... | |
|
|
|
|
|
|
|
для: kukuikar
(22.02.2007 в 02:40)
| | тогда достаточно будет "нараздавать" дивам разные ай-ди-шники и сделать функцию сокрытия предыдущего открытого дива, также функции может потребоваться некая переменная, в которой будет храниться ай-ди открытого дива. | |
|
|
|
|
|
|
|
для: 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, поэтому наверное грубовато... | |
|
|
|
|
|
|
|
для: kukuikar
(22.02.2007 в 02:52)
| | не помню, как воспринимает яваскрипт параметр "нон", то ли как слово, то ли, как пустоту или нолик, это вы сможете узнать произведя трассировку, например алертом по значению свойства, функция вроде правильная, но если требуется закрывать открытый кликая на другой див, то понадобиться переменная для хранения ай-ди открытого дива | |
|
|
|
|
|
|
|
для: retsoul
(22.02.2007 в 02:57)
| | Этого я и пытаюсь добится. Функция открывает и закрывает дивы корректно. но можно открыть все дивы по очереди, а так мне не надо.
Как же мне закрыть предыдущий открытый див? | |
|
|
|
|
|
|
|
для: kukuikar
(22.02.2007 в 02:59)
| | дело в том, что ай-ди-шки у дивов разные, поэтому в этой функции потребуется дополнительная глобальная переменная, в которую будет сохраняться ай-ди открывающего дива, то есть присвоение ей значения будет в том блоке, где "дисплею" присваиваем значени "блок", а для закрытия открытого потребуется блок с обращением к этой глобальной переменной и всё, для исключения внештатных ситуаций можно назначить этой переменной значение - none, а при вызове закрывающей функции проверять на неравность дефалтовому значению, но это так, перестраховка :) | |
|
|
|
|
|
|
|
для: 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
}
|
| |
|
|
|
|
|
|
|
для: CNT
(22.02.2007 в 07:30)
| | Спасибо. Только фцнкция скрывает все дивы.
Мне надо оставить видимыми всн дивы с именем '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? | |
|
|
|
|
|
|
|
для: 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 в 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];
}
|
| |
|
|
|
|
|
|
|
для: 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) выполняется и он не показыват его. чего-то немогу решить это... | |
|
|
|
|
|
|
|
для: 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);
}
}
|
| |
|
|
|
|
|
|
|
для: CNT
(23.02.2007 в 19:56)
| |
Все превосходно работает. Огроменное спасибо.
|
Теперь буду делать чтобы ДИВ медленно раскрывался вниз, и сворачивался вверх. Это я на этом форуме видел, попробую сам. Но если что.... :) | |
|
|
|