zaza41rus
@zaza41rus

Упростить js скрипт?


Есть
<script>
document.querySelector('.blocks__item[data-item="screen"]').addEventListener('mouseenter', function() {
		document.querySelector('.blocks__phone-bg').classList.add('blocks__phone-bg--screen');
		document.querySelector('.blocks__phone-bg').className = 'blocks__phone-bg blocks__phone-bg--screen';

		document.querySelector('.blocks__item[data-item="screen"]').classList.add('blocks__item--active');
		document.querySelector('.blocks__item[data-item="goods"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="gallery"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="reviews"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="contacts"]').className = 'blocks__item';
});

document.querySelector('.blocks__item[data-item="goods"]').addEventListener('mouseenter', function() {
		document.querySelector('.blocks__phone-bg').classList.add('blocks__phone-bg--goods');
		document.querySelector('.blocks__phone-bg').className = 'blocks__phone-bg blocks__phone-bg--goods';

		document.querySelector('.blocks__item[data-item="goods"]').classList.add('blocks__item--active');
		document.querySelector('.blocks__item[data-item="screen"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="gallery"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="reviews"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="contacts"]').className = 'blocks__item';
});

document.querySelector('.blocks__item[data-item="gallery"]').addEventListener('mouseenter', function() {
		document.querySelector('.blocks__phone-bg').classList.add('blocks__phone-bg--gallery');
		document.querySelector('.blocks__phone-bg').className = 'blocks__phone-bg blocks__phone-bg--gallery';

		document.querySelector('.blocks__item[data-item="gallery"]').classList.add('blocks__item--active');
		document.querySelector('.blocks__item[data-item="screen"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="goods"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="reviews"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="contacts"]').className = 'blocks__item';
});

document.querySelector('.blocks__item[data-item="reviews"]').addEventListener('mouseenter', function() {
		document.querySelector('.blocks__phone-bg').classList.add('blocks__phone-bg--reviews');
		document.querySelector('.blocks__phone-bg').className = 'blocks__phone-bg blocks__phone-bg--reviews';

		document.querySelector('.blocks__item[data-item="reviews"]').classList.add('blocks__item--active');
		document.querySelector('.blocks__item[data-item="goods"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="gallery"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="screen"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="contacts"]').className = 'blocks__item';
});

document.querySelector('.blocks__item[data-item="contacts"]').addEventListener('mouseenter', function() {
		document.querySelector('.blocks__phone-bg').classList.add('blocks__phone-bg--contacts');
		document.querySelector('.blocks__phone-bg').className = 'blocks__phone-bg blocks__phone-bg--contacts';

		document.querySelector('.blocks__item[data-item="contacts"]').classList.add('blocks__item--active');
		document.querySelector('.blocks__item[data-item="goods"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="gallery"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="reviews"]').className = 'blocks__item';
		document.querySelector('.blocks__item[data-item="screen"]').className = 'blocks__item';
});
</script>


При наведении на одно добавляеся класс у другова блока и удаляется класс у преведущего.
Как можно упростить данный скрипт, а то при добавлении всего одного блока приходиться добовлять туеву кучу данных в этот скрипт
  • Вопрос задан
  • 141 просмотр
Решения вопроса 1
@garbagecollected
// Пусть, список будет в строке разделенной вертикальной чертой
"contacts|goods|gallery|reviews|screen".split`|`
// Находим каждый элемент
.map(data=>document.querySelector(`.blocks__item[data-item="${data}"]`))
// Вешаем на элементы событие mouseenter
.forEach(el=>el.addEventListener('mouseenter',e=>{
  // Класс активного элемента надо удалить только у активного элемента
  document.querySelector`.blocks__item.blocks__item--active`.classList.remove`blocks__item--active`;
  // А элементу, вызвавшему это событие надо добавить класс активности
  e.target.classList.add`blocks__item--active`;
  // Еще где-то какому-то элементу присвоим класс, частично формирующийся из атрибута элемента события 
  document.querySelector`.blocks__phone-bg`.className = `blocks__phone-bg blocks__phone-bg--${e.target.getAttribute`data-item`}`;
});
// Вот и все!
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ProgrammerForever
@ProgrammerForever
Учитель, автоэлектрик, программист, музыкант
Отделите данные от скрипта, будет компактнее. Да и много повторений
const tags = ['screen', 'goods', 'gallery', 'reviews', 'contacts'];
function enableBlock(blockTag) {
    document.querySelector('.blocks__phone-bg').classList.add(`blocks__phone-bg--${blockTag}`);
    document.querySelector('.blocks__phone-bg').className = `blocks__phone-bg blocks__phone-bg--${blockTag}`;
    tags.forEach(tag=>{
      let elem = document.querySelector(`.blocks__item[data-item="${tag}"]`);
      if (!elem){
         return;
      };
      if (blockTag===tag){
        elem.classList.add('blocks__item--active');
      }else{
        elem.className = 'blocks__item';
      };
    });
}
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы