Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   открытие div и смена текста в a (ссылка) (https://javascript.ru/forum/events/74721-otkrytie-div-i-smena-teksta-v-ssylka.html)

rognarek 02.08.2018 21:02

открытие div и смена текста в a (ссылка)
 
Доброго времени суток. Подскажите, плиз, что я не так в этом коде написала. Т.е. мне хотелось бы, что при нажатии на ссылку открывался div и менялся текст ссылки, а при повторном нажатии div закрывался и текст ссылки менялся на обратный. Но смена текста ссылки не происходит ((((. Мне кажется, что я как-то неправильно toggler указываю, но не могу понять, как скрипту сказать, чтобы он к ссылке это применял.
<script type="text/javascript">
            function showHide(element_id) {
				var obj = document.getElementById(element_id);
                if (document.getElementById(element_id)) {                                        
                    if (obj.style.display != "block") { 
                        obj.style.display = "block";
			toggler.innerHTML = 'Закрыть'; return
                    }
                    else obj.style.display = "none";
   			   toggler.innerHTML = 'Открыть';
                }
                else alert("Элемент с id: " + element_id + " не найден!"); 
            }   
        </script>


<a href="javascript:void(0)" onclick="showHide('block_id');return false;" id="toggler">Открыть</a><br/><br/>
        <div id="block_id" style="display: none;">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
        </div>

        <a href="javascript:void(0)" onclick="showHide('block_id_2');return false;" id="toggler">Открыть</a><br/><br/>
        <div id="block_id_2" style="display: none;">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. 
        </div>


Спасибо за внимание.

рони 02.08.2018 21:43

rognarek,
id уникально!!!

Malleys 02.08.2018 22:03

У вас не указан toggler, у каждого блока должен быть свой.

<html>
	<head>
		<meta charset="utf-8">
		<style>

hr {
	all: unset;
	height: 30px;
	display: block;
}

		</style>
	</head>
	<body>
		<a href="javascript:void(0)" onclick="showHide('block_id','toggler_1');return false;" id="toggler_1">Открыть</a>
		<div id="block_id" style="display: none;">
		Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
		</div>

		<hr>

		<a href="javascript:void(0)" onclick="showHide('block_id_2','toggler_2');return false;" id="toggler_2">Открыть</a>
		<div id="block_id_2" style="display: none;">
		Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. 
		</div>

		<script>
			
function showHide(element_id, toggler_id) {
	var obj = document.getElementById(element_id);
	var toggler = document.getElementById(toggler_id);
	if(document.getElementById(element_id)) {
		if(obj.style.display != "block") {
			obj.style.display = "block";
			toggler.innerHTML = 'Закрыть';
			return;
		} else
			obj.style.display = "none";

		toggler.innerHTML = 'Открыть';
	} else
		alert("Элемент с id: " + element_id + " не найден!");
}

		</script>
	</body>
</html>


Немного о том, как можно упростить. Ведь когда будет много таких блоков, это будет сложно поддерживать. В спецификации HTML 5.2 определён элемент details, который представляет собой раскрывающийся виджет, из которого пользователь может получить дополнительную информацию или элементы управления.

Ваш пример с элементом details:

<html>
	<head>
		<meta charset="utf-8">
		<style>

summary::after {
	content: "Открыть";
}

details {
	margin-bottom: 30px;
}

details[open] summary::after {
	content: "Закрыть";
}

		</style>
	</head>
	<body>
		<details>
			<summary></summary>
			Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
		</details>

		<details>
			<summary></summary>
			Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. 
		</details>
	</body>
</html>


ОСТОРОЖНО! Первый пример содержит неправильное использование элемента HTML, а именно ссылки (элемент A). Текст ссылки гласит ― Открыть, что может ввести пользователя в заблуждение. И действительно, пользователь видит перед собой ссылку, он может её перетащить в другое окно, добавить в закладки, в контекстном меню выбрать Открыть в новой вкладке, однако его действия завершатся неудачей, поскольку будет открыта пустая вкладка.

В таком случае лучше использовать кнопку (элемент BUTTON)

рони 02.08.2018 22:38

rognarek,
если блок сразу после кнопки
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  div.block{
      display: none;
  }
  .open + div.block {
      display:  block;
  }
  .toggler{
      margin-bottom: 12px;
      display: block;
  }

  .toggler:after{
      content: "Открыть";
  }
  .toggler.open:after{
      content: "Закрыть";
  }
  </style>
  <script>
    function showHide(elem)
    {
       elem.classList.toggle("open")
    }
  </script>
</head>

<body>
<BUTTON onclick="showHide(this)" class="toggler"></BUTTON>
        <div class="block">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
        </div>

        <BUTTON  onclick="showHide(this)" class="toggler"></BUTTON>
        <div class="block">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
        </div>

</body>

</html>

j0hnik 02.08.2018 23:58

<button>открыть</button>
	<div class="block" style="display:none;">
		Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
	</div>
<br>
	<button>открыть</button>
	<div class="block" style="display:none;">
		Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
	</div>
	<script>
		var block = document.querySelectorAll('.block');
		document.querySelectorAll('button').forEach((el,i)=>el.onclick=e=>{
			var text = el.textContent;
			el.textContent = text == 'открыть'?'закрыть':'открыть';
			block[i].style.display = text == 'открыть'?'block':'none';
		});
	</script>

rognarek 03.08.2018 07:01

Спасибо всем большое! :thanks: :thanks: :thanks:

Цитата:

Сообщение от Malleys (Сообщение 491624)
У вас не указан toggler, у каждого блока должен быть свой.

вот балда, размножила ссылки и забыла про id. Спасибо большое!


Цитата:

Сообщение от Malleys (Сообщение 491624)
Немного о том, как можно упростить. Ведь когда будет много таких блоков, это будет сложно поддерживать. В спецификации HTML 5.2 определён элемент details, который представляет собой раскрывающийся виджет, из которого пользователь может получить дополнительную информацию или элементы управления.

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


Цитата:

Сообщение от Malleys (Сообщение 491624)
ОСТОРОЖНО! Первый пример содержит неправильное использование элемента HTML, а именно ссылки (элемент A). Текст ссылки гласит ― Открыть, что может ввести пользователя в заблуждение. И действительно, пользователь видит перед собой ссылку, он может её перетащить в другое окно, добавить в закладки, в контекстном меню выбрать Открыть в новой вкладке, однако его действия завершатся неудачей, поскольку будет открыта пустая вкладка.

Спасибо за информацию, сделаю тогда "подробнее" и "скрыть".

rognarek 03.08.2018 07:10

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

рони 03.08.2018 12:19

Цитата:

Сообщение от rognarek
просто для интереса, если я захочу, чтобы другие открытые блоки скрывались

400!!! четыреста вариантов на форуме!!! ключевое слово: открывашка

j0hnik 03.08.2018 13:27

rognarek,
мой пост посмотрите, блоков можно вставить сколько угодно

rognarek 03.08.2018 14:50

Хорошо, спасибо.


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