@sazonoww
Я верстаю сайты

Как разворачивать и сворачивать (2 и более статей не получается)?

Почему 1 статья не разворачивается ,а разворачивается 2 статья ,но при этом (2 статья) разворачиваться/сворачивается .
(1 статья)
тест текст текст<div id="info" class="text__podzigilovol">теуст теуст теуст 
<?--</div> 
<p><a href="javascript:sh()" class="text__glavn js-btn-readmore" >далее</a></p> 
<script type="text/javascript"> 
sh(); 
function sh() { 
obj = document.getElementById("info"); 
if( obj.style.display == "none" ) {
  obj.style.display = "block";
} else {
  obj.style.display = "none";
} 
} 
</script>

Вторая статья.
текст текст текст 
<div id="1_info" class="text__podzigilovol"> 
текст текст текст </div> 
<p><a href="javascript:sh()" class="text__podzigilovol">далее</a></p> 
<script type="text/javascript"> 
sh(); 
function sh() { 
obj = document.getElementById("1_info"); 
if( obj.style.display == "none" ) { obj.style.display = "block"; } else { obj.style.display = "none"; } 
} 
</script>
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Не работает потому, что функцию sh() переопределяете для каждой статьи заново – остаётся последний вариант.

Лучше сделать так:
  1. Скрываемым частям статей давать класс с display:none У вас это text__podzigilovol.
  2. В ссылке-кнопке для спрятать/показать записывать id управляемой статьи в data-атрибуте: data-id="info-2" – так кнопка будет «знать», кем она управляет.
  3. Кнопкам не писать в href никакого javascript:..., вместо этого лучше на них повесить слушателя события клика. Удобно дать всем кнопкам определённый класс, по нему их отыскать и в цикле повесить слушателя события.
  4. Обработчик клика описывается лишь один раз. Он получает в качестве this кликнутую ссылку. Из неё берёт data-атрибут с id нужного блока. И включает/выключает ему класс, который прячет этот блок.
Рабочий пример
Код
function sh(event) {
  const className = "text__podzigilovol";
  event.preventDefault();

  obj = document.getElementById(this.dataset.id);
  if(!obj) return;
  if( obj.classList.contains(className)) {
    obj.classList.remove(className);
  } else {
    obj.classList.add(className);
  } 
} 


Array.prototype.forEach.call(
  document.querySelectorAll('.js-btn-readmore'),
  function(e){
    e.addEventListener('click', sh);
  }
);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы