Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Скрытие блоков (https://javascript.ru/forum/dom-window/8707-skrytie-blokov.html)

xvasekx 09.04.2010 14:35

Скрытие блоков
 
есть код:
<html>
<head>
<script type="text/javascript">
<!--
function open_reshenie(reshenie)
{
var obj=document.getElementById(reshenie);
if(obj.style.display=='none')
obj.style.display='block';
else
obj.style.display='none';
}
-->
</script>
</head>
<body>

<p><a href='javascript: open_reshenie(1)'>Открыть решение задачи 1</a>
<div ID=1 Style='text-indent:0pt;display:none'><p>решение 1</div>


<p><a href='javascript: open_reshenie(2)'>Открыть решение задачи 2</a>
<div ID=2 Style='text-indent:0pt;display:none'><p>решение 2</div>

<p><a href='javascript: open_reshenie(3)'>Открыть решение задачи 3</a>
<div ID=3 Style='text-indent:0pt;display:none'><p>решение 3</div>

</body>
</html>
нужно сделать так чтобы при клике по ссылке закрывался предыдущий блок и открывался блок именно той задачи которую мы хотим. Помогите плиз. :(

Skipp 09.04.2010 14:42

во первых закрой все теги <p>

xvasekx 09.04.2010 14:46

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

Skipp 09.04.2010 16:05

<html>
<head>
<script type="text/javascript">
function open_reshenie(reshenie)
{
	var reg = /^d\d{1,}$/;
	var divs = document.getElementsByTagName('div');
	for(var i = 0; i<divs.length; i++)
		if(divs[i].id.search(reg) + 1 && divs[i].id!=reshenie) divs[i].style.display='none';
		
	var obj=document.getElementById(reshenie);
	obj.style.display=='none' ? obj.style.display='block' : obj.style.display='none';
}
</script>
</head>
<body>

<div><a href='javascript: open_reshenie("d1")'>Открыть решение задачи 1</a></div>
<div id="d1" style='text-indent:0pt;display:none'>решение 1</div>


<div><a href='javascript: open_reshenie("d2")'>Открыть решение задачи 2</a></div>
<div id="d2" style='text-indent:0pt;display:none'>решение 2</div>

<div><a href='javascript: open_reshenie("d3")'>Открыть решение задачи 3</a></div>
<div id="d3" style='text-indent:0pt;display:none'>решение 3</div>

</body>
</html>

xvasekx 09.04.2010 16:15

спасибо огромное :thanks: ... слушай еще вопрос: што это такое? reg = /^d\d{1,}$/;

Skipp 09.04.2010 16:18

регулярное выражение.
В данном случаи суть этого выражения d+цифры(длиной от 1 до дохрена).

xvasekx 09.04.2010 16:20

ну все ясно премного благодарен

lammeR 09.04.2010 16:57

Skipp,
А что такое "+1" здесь-> divs[i].id.search(reg) + 1, ищём id в названии, которого на цифру 1 больше?

xvasekx 09.04.2010 17:24

как я понял скрывать нужно каждый следующий тег <div> и если id не является равным id ссылки

subzey 09.04.2010 17:26

Вы же не будете связывать таким образом, по id, 10 000 блоков? (Да и, кстати, параметр id не должен начинаться с цифры :) )
Нужно другое решение.
  1. Используйте DOM для связывания объектов
  2. Для изменения состояния блока указывайте класс

Это сильно упростит Вашу задачу. :)

Для примера, можете открыть в опере opera:config и поковыряться в ней дебаггером.

Мендыбаев Игорь 12.04.2010 07:52

Несколько вопросов к автору скрипта.

1. Не знал, что значение переменной может одновременно быть выражением. var reg = /^d\d{1,}$/;
2. Зачем два раза писать var? Почему нельзя задать переменные через запятую, таким образом:
var reg = /^d\d{1,}$/, divs = document.getElementsByTagName('div');
3. На сколько я знаю при for, значение переменной записывается уже в for (пример: (i = 1; i <= 10; i++)... и зачем в скобках опять писать var?
4. Что значит, &&?
5. Объясните вообще дословно, построчно как все это действует. Думаю это будет очень хорошим уроком по javascript. Так что если не трудно.

Кстати кто понимает, думаю не помешает и ваши комментарии.
Заранее спасибо

Skipp 12.04.2010 09:57

Цитата:

Сообщение от lammeR (Сообщение 50811)
Skipp,
А что такое "+1" здесь-> divs[i].id.search(reg) + 1, ищём id в названии, которого на цифру 1 больше?

search(reg) - возвращает отсчитываемое от нуля индексное значение первого символа в строке. А если вхождений нет, то возвращает -1 .
Так если стока не найдена то получится -1 + 1 = 0(false), если найдёт, а найти получится, только начиная с первого элемента (в выражении), то получится 0 + 1 = 1 (true).

Skipp 12.04.2010 10:31

Цитата:

Сообщение от Мендыбаев Игорь (Сообщение 51269)
Несколько вопросов к автору скрипта.

1. Не знал, что значение переменной может одновременно быть выражением. var reg = /^d\d{1,}$/;
2. Зачем два раза писать var? Почему нельзя задать переменные через запятую, таким образом:
var reg = /^d\d{1,}$/, divs = document.getElementsByTagName('div');
3. На сколько я знаю при for, значение переменной записывается уже в for (пример: (i = 1; i <= 10; i++)... и зачем в скобках опять писать var?
4. Что значит, &&?
5. Объясните вообще дословно, построчно как все это действует. Думаю это будет очень хорошим уроком по javascript. Так что если не трудно.

Кстати кто понимает, думаю не помешает и ваши комментарии.
Заранее спасибо

1. Можно ещё использовать RegExp(), а вообще суть вопроса не понял)
2. Почему же можно, это чисто желание программиста. Я вот решил написать так=)
3. Честно не помню откуда у меня такая привычка появилась и не помню зачем, сам бы хотел узнать. А так вообще по мучай вот этот код, запусти а потом удали var в цикле и ещё раз запусти=)
Если поймёшь, зачем я так сделал напиши=)))
<script type="text/javascript">
var i = 32;
function open_reshenie(reshenie)
{
	alert(i);
	var reg = /^d\d{1,}$/;
	var divs = document.getElementsByTagName('div');
	for(var i = 0; i<divs.length; i++)
		if(divs[i].id.search(reg) + 1 && divs[i].id!=reshenie) divs[i].style.display='none';
	alert(i);	
	var obj=document.getElementById(reshenie);
	obj.style.display=='none' ? obj.style.display='block' : obj.style.display='none';
}
</script>

4. Логический оператор (И).
5.
var reg = /^d\d{1,}$/; //регулярное выражение, его суть (начало строки + d + числовое значение от 1 символа до дохрена) =)
	var divs = document.getElementsByTagName('div'); // Получаем все элементы div находящиеся на странице
	for(var i = 0; i<divs.length; i++) //Запускаем цикл
		if(divs[i].id.search(reg) + 1 && divs[i].id!=reshenie) divs[i].style.display='none'; // задаем всем дивам с id == d + числовое значение стиль display='none', кроме того что нам надо показать

	var obj=document.getElementById(reshenie); //Получаем элемент блока, который необходимо вывести
	obj.style.display=='none' ? obj.style.display='block' : obj.style.display='none'; //Проверяем стиль display если он равен none то делаем его равным block, а если block , то делаем его равным none


В общем как-то так. Я сам ещё ток начал учить, понимать тонкости js, поэтому сильно не ругайте, если что не понятно и не по батенски=)

Kolyaj 12.04.2010 12:32

Цитата:

Сообщение от Мендыбаев Игорь
Думаю это будет очень хорошим уроком по javascript.

Это будет плохим уроком. Это самые азы, описанные в любом захудалом учебнике.

Skipp 12.04.2010 12:38

В учебнике, не всегда найти, то что можно понять.

Мендыбаев Игорь 12.04.2010 12:40

Грамотный ответ!!!
Правда не пойму для чего тут alert???
Var в цикле убирал, но не понял)))

Особенно понравился ответ на пятый вопрос, спасибо)))
Кстати на счет захудалых учебниках... может подскажешь, что нибудь хорошее???

Kolyaj 12.04.2010 12:42

Цитата:

Сообщение от Мендыбаев Игорь
Кстати на счет захудалых учебниках...

http://javascript.ru/doctree -- очень даже не захудалый.

Мендыбаев Игорь 12.04.2010 12:47

Ок. спасибо,:thanks:
но я его уже почитываю...
А есть еще где по проще?


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