Выбрать более грамотный код с точки зрения оптимизации/производительности

Всем счастья и здоровья! Имеются два скрипта, которые делают одно и то же, ⠀⠀⠀ ⠀⠀⠀ ⠀⠀⠀ ⠀ при наведении мыши на блок, меняется цвет текста на красный и сбрасывается.

Но я не могу понять, какой из этих скриптов лучше по оптимизации/производительности. ⠀⠀⠀ Если блоков будет 100 или 200, то какой способ будет лучше, с методом parentNode или с перебором forEach? ⠀Еще мне кажется, что мой метод с parentNode это костыль какой-то =(

// C методом ***parentNode***
let News_Main_Block = document.querySelector('.Сategory_Main_Block'); 

News_Main_Block.addEventListener('mouseover', function(e){  
let parentNode = e.target.parentNode; 

if(parentNode.className == 'Сategory_Block_1'){
parentNode.querySelector('.Сategory_name_1').style.color = 'red';  
}
});

News_Main_Block.addEventListener('mouseout', function(e){  
let parentNode = e.target.parentNode; 

if(parentNode.className == 'Сategory_Block_1'){
parentNode.querySelector('.Сategory_name_1').style.color = ''; 
}
});


// С методом ***forEach***
/*
let News_Main_Block = document.querySelector('.Сategory_Main_Block');
let News_Block = document.querySelectorAll('.Сategory_Block_1');

News_Block.forEach(function (e) {  

e.addEventListener('mouseenter', function(e) {
let target = e.target,
name = target.querySelector('.Сategory_name_1');

if(name) {
name.style.color = 'red';
}
});

e.addEventListener('mouseleave', function(e) {
let target = e.target,
name = target.querySelector('.Сategory_name_1');

if(name) {
name.style.color = '';
}
});

});
*/
.Сategory_Main_Block{
padding-top:2vw;
padding-bottom: 2vw;
display: grid;
grid-template-columns: repeat(6, 30%);
column-gap:1vw;
row-gap:3vw;
margin-left:2vw;
}

.Сategory_Block_1{
background:rgba(255, 255, 255, 1);
border-radius: 1.5vw;
box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
margin:0;
display: flex;             
flex-direction: column;   
align-items: center;       
position: relative;
}

.Сategory_name_1{
text-align:center;      
flex: 1;                 
display: flex;           
align-items: center;    
padding:10px;
font-size:18px; 
color:black;
font-family:arial;
}

.Сategory_img_1{
border-top-right-radius: 1.5vw;
border-top-left-radius: 1.5vw;  
width:100%; 
height:25vw;                                
}

.Сategory_Link_1{
border-top-right-radius: 1.5vw;
border-top-left-radius: 1.5vw;      
width:100%;
height:25vw;   
position:absolute;
display:flex;
box-sizing: border-box;
}
<section class="Сategory_Main_Block"> 

<figure class="Сategory_Block_1">
<a class ="Сategory_Link_1" href="/"><div></div></a>
<img class="Сategory_img_1" src="https://i.ibb.co/ZW3xn2G/5-1.jpg">
<figcaption class="Сategory_name_1">1 ПЕС И ЛИСА</figcaption>
</figure>


<figure class="Сategory_Block_1">
<a class ="Сategory_Link_1" href="/"><div></div></a>
<img class="Сategory_img_1" src="https://i.ibb.co/N9L9rjq/scale-1200.webp">
<figcaption class="Сategory_name_1">2 ВОЛК И ЛАПША</figcaption>
</figure>


<figure class="Сategory_Block_1">
<a class ="Сategory_Link_1" href="/"><div></div></a>
<img class="Сategory_img_1" src="https://i.ibb.co/sHrLCtS/1412772681-kitajskaya-lapsha-v-domashnix-usloviyax.jpg">
<figcaption class="Сategory_name_1">3 КИДО И ХАДО</figcaption>
</figure>

</section>


Ответы (1 шт):

Автор решения: De.Minov

Отталкиваясь от вашего предыдущего вопроса, где вы сказали что суть только в смене цвета, я (как и @Василий Воронцов) настоятельно рекомендую использовать CSS, если вы гонитесь за оптимизацией. Для браузера это будет куда проще обработать.

.Сategory_Main_Block {
  padding-top: 2vw;
  padding-bottom: 2vw;
  display: grid;
  grid-template-columns: repeat(6, 30%);
  column-gap: 1vw;
  row-gap: 3vw;
  margin-left: 2vw;
}

.Сategory_Block_1 {
  background: rgba(255, 255, 255, 1);
  border-radius: 1.5vw;
  box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
  margin: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  position: relative;
}

.Сategory_name_1 {
  text-align: center;
  flex: 1;
  display: flex;
  align-items: center;
  padding: 10px;
  font-size: 18px;
  color: black;
  font-family: arial;
}

.Сategory_img_1 {
  border-top-right-radius: 1.5vw;
  border-top-left-radius: 1.5vw;
  width: 100%;
  height: 25vw;
}

.Сategory_Link_1 {
  border-top-right-radius: 1.5vw;
  border-top-left-radius: 1.5vw;
  width: 100%;
  height: 25vw;
  position: absolute;
  display: flex;
  box-sizing: border-box;
}

/* Меняем цвет текста при наведение на блок */
.Сategory_Block_1:hover .Сategory_name_1 {
  color: red;
}
<section class="Сategory_Main_Block">

  <figure class="Сategory_Block_1">
    <a class="Сategory_Link_1" href="/"><div></div></a>
    <img class="Сategory_img_1" src="https://i.ibb.co/ZW3xn2G/5-1.jpg">
    <figcaption class="Сategory_name_1">1 ПЕС И ЛИСА</figcaption>
  </figure>


  <figure class="Сategory_Block_1">
    <a class="Сategory_Link_1" href="/"><div></div></a>
    <img class="Сategory_img_1" src="https://i.ibb.co/N9L9rjq/scale-1200.webp">
    <figcaption class="Сategory_name_1">2 ВОЛК И ЛАПША</figcaption>
  </figure>


  <figure class="Сategory_Block_1">
    <a class="Сategory_Link_1" href="/"><div></div></a>
    <img class="Сategory_img_1" src="https://i.ibb.co/sHrLCtS/1412772681-kitajskaya-lapsha-v-domashnix-usloviyax.jpg">
    <figcaption class="Сategory_name_1">3 КИДО И ХАДО</figcaption>
  </figure>

</section>


Если же всё таки нужен JS, то будем разбираться.

Начну вот с чего. Вы говорите о оптимизации и производительности, но выводить 100-200 блоков с картинками и вложенными элементами - это уже нарушает условия выше.
Обычно, для того, чтобы показать пользователю карточки, их на страницу выводится 10-20 штук и прибегают к таким трюкам как Пагинация (пейджинг), Lazy Load (только для блоков, принцип тот же) или иные варианты.

Основная проблема всё же кроется в юзере, а точнее в его устройстве, средстве просмотра и скорости\доступности интернет соединения. Более мощным устройствам и современным браузерам будет не так "трудно" обработать 100-200 блоков, а быстрому инету загрузить 100-200 картинок с этих блоков, но не стоит забывать о старых устройствах, людях которые сидят на старых версиях браузеров (IE, ней дай бог..), и плохим соединением инета.


Вернёмся к коду.

Ваш вариант не костыльный, такой подход называется "Делегирование событий", я хотел предложить его вам в прошлом вопросе, но не стал нагружать информацией. (и рад, что вы к этому сами пришли).
Но есть проблемы по коду:

  1. Для начала я хочу попросить прочитать статью о делегирование, чтобы понимать принцип работы кода.

  2. e.target.parentNode лучше заменить на e.target.closest('.Сategory_Block_1') - вложенность может быть разной, а .parentNode вернёт прямого родителя e.target, в то время как .closest('.Сategory_Block_1') будет искать родителя именно .Сategory_Block_1, если не найдёт то вернёт null.

  3. parentNode.className == 'Сategory_Block_1', лучше так не делать.. Добавите новый класс и условие не пройдёт. Я бы советовал использовать parentNode.classList.contains('Сategory_Block_1') - .classList вернёт массив (кхм, DOMTokenList) классов элемента, а .contains() проверит есть ли совпадение в массиве DOMTokenList.

let main = document.querySelector('.Сategory_Main_Block');

main.addEventListener('mouseover', function(e) {
  let target = e.target.closest('.Сategory_Block_1');

  if(target) { // Проверку на класс делать смысла нет
    target.querySelector('.Сategory_name_1').style.color = 'red';
  }
});

main.addEventListener('mouseout', function(e) {
  let target = e.target.closest('.Сategory_Block_1');

  if(target) {
    target.querySelector('.Сategory_name_1').style.color = '';
  }
});
.Сategory_Main_Block {
  padding-top: 2vw;
  padding-bottom: 2vw;
  display: grid;
  grid-template-columns: repeat(6, 30%);
  column-gap: 1vw;
  row-gap: 3vw;
  margin-left: 2vw;
}

.Сategory_Block_1 {
  background: rgba(255, 255, 255, 1);
  border-radius: 1.5vw;
  box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);
  margin: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  position: relative;
}

.Сategory_name_1 {
  text-align: center;
  flex: 1;
  display: flex;
  align-items: center;
  padding: 10px;
  font-size: 18px;
  color: black;
  font-family: arial;
}

.Сategory_img_1 {
  border-top-right-radius: 1.5vw;
  border-top-left-radius: 1.5vw;
  width: 100%;
  height: 25vw;
}

.Сategory_Link_1 {
  border-top-right-radius: 1.5vw;
  border-top-left-radius: 1.5vw;
  width: 100%;
  height: 25vw;
  position: absolute;
  display: flex;
  box-sizing: border-box;
}
<section class="Сategory_Main_Block">

  <figure class="Сategory_Block_1">
    <a class="Сategory_Link_1" href="#"><div></div></a>
    <img class="Сategory_img_1" src="//i.ibb.co/ZW3xn2G/5-1.jpg">
    <figcaption class="Сategory_name_1">1 ПЕС И ЛИСА</figcaption>
  </figure>


  <figure class="Сategory_Block_1">
    <a class="Сategory_Link_1" href="#"><div></div></a>
    <img class="Сategory_img_1" src="//i.ibb.co/N9L9rjq/scale-1200.webp">
    <figcaption class="Сategory_name_1">2 ВОЛК И ЛАПША</figcaption>
  </figure>


  <figure class="Сategory_Block_1">
    <a class="Сategory_Link_1" href="#"><div></div></a>
    <img class="Сategory_img_1" src="//i.ibb.co/sHrLCtS/1412772681-kitajskaya-lapsha-v-domashnix-usloviyax.jpg">
    <figcaption class="Сategory_name_1">3 КИДО И ХАДО</figcaption>
  </figure>

</section>

→ Ссылка