NotNight
@NotNight

Насколько правильный код?

Приветствую!

Написал небольшой и простенький скрипт, который разворачивает окно при нажатии на кнопку "Открыть" и скрывает блок, при нажатии на "Закрыть".

Гуру, можете дать пожалуйста оценку данному скрипту, насколько он лаконичный и правильно написан?

<button class="open">
        Open
    </button>
    <div class="hidden-block ">
        <ul>
            <li>Первый</li>
            <li>Второй</li>
            <li>Третий</li>
            <li>Четвертый</li>
            <li>Пятый</li>
        </ul>
        <button class="close">Close</button>
    </div>


.hidden-block {
    transform: translateX(-100%);
    transition: all 0.3s;
}
.open-hidden-block {
    transform: translateX(0);
    transition: all 0.3s;
}


let openBlock = document.querySelector('.open');
let backBlock = document.querySelector('.close');

openBlock.addEventListener('click', () => {  
  document.querySelector('.hidden-block').classList.add('open-hidden-block');
    backBlock.addEventListener('click', () => {  
      document.querySelector('.hidden-block').classList.remove('open-hidden-block')
    });
});
  • Вопрос задан
  • 110 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Ошибка:
Не правильно, что backBlock.addEventListener добавляется внутри обработчика клика. Т.е. каждый раз, как нажимаем на openBlock, вешается ещё и ещё один обработчик на backBlock. Достаточно один раз, заранее, так же как сейчас openBlock.addEventListener

Мелочи:
  1. openBlock и backBlock не меняются, их можно вместо let объявить const
  2. внутри обработчиков событий снова и снова искать document.querySelector('.hidden-block') наверное, не имеет смысла, достаточно один раз, заранее
    const hiddenBlock = document.querySelector('.hidden-block');
    и далее обращаться к этой константе hiddenBlock.

Культура:
Хорошо бы песочницу на CodePen, где можно вживую проверить работу этого кода. И вставить её в сам вопрос, через кнопку [ + ]
Ответ написан
Комментировать
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
Если блоков будет несколько, то кнопка будет открывать только первый.
Нужно сделать связь между ними

<button class="open" data-target="b1">Open1</button>
<button class="open" data-target="b2">Open2</button>
<div class="hidden-block" id="b1">
  <ul>
    <li>Первый</li>
  </ul>
  <button class="close">Close</button>
</div>
<div class="hidden-block" id="b2">
  <ul>
    <li>Второй</li>
  </ul>
  <button class="close">Close</button>
</div>


// 1. Константа, значение не меняется
// 2. Это кнопка, а не блок (название фиговое)
// 3. Их может быть несколько на странице
const openButtons = document.querySelectorAll('.open');

// Закрывашка находится внутри блока, поэтому искать ее нужно именно внутри блока
// чтобы она закрывала только свой блок. Это выкидываем
// let backBlock = document.querySelector('.close');

// Вешаем клики на все открывашки
openButtons.forEach(btn => {
  btn.addEventListener('click', e => {  
    // дергаем ID из data-атрибута
    const targetId = e.target.dataset.target;
    document.getElementById(targetId).classList.add('open-hidden-block');
  });
});

// Перебираем все блоки и ищем в них закрывашки
document.querySelectorAll('.hidden-block').forEach(block => {
  const closer = block.querySelector('.close');
  closer.addEventListener('click', () => {
    block.classList.remove('open-hidden-block');
  });
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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