Добавьте дополнительный класс к тегу с помощью JavaScript

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

Для этого я написал код скрипта, который хорошо показывает и скрывает заголовок, но цвет фона не меняется.

В итоге: Я хочу, чтобы класс .background был добавлен в класс .box_mini, когда заголовок скрыт.

Я использовал этот код, чтобы добавить новый класс к предыдущему классу:

$(document).ready(function () {
    $('.box_mini').click(function () {
        $(this).toggleClass('background');
    });
});

Но я не знаю, что здесь делать?

Мои коды следующие:

let mini = document.querySelector(".box_mini");

document.querySelectorAll('.box_icon').forEach(eye => {
    eye.addEventListener("click", function() {
    let excerpt = this.parentNode.querySelector(".title_box");
    if (this.classList.contains("bi-play-circle-fill")) {
        this.classList = "bi bi-power box_icon";
        excerpt.style.display = "block";
    } else {
        this.classList = "bi bi-play-circle-fill box_icon";
        excerpt.style.display = "none"
        
         $(mini).ready(function () {
                $(this).toggleClass('background');
            });
      }
  });
});   
 .box_main {
        display: flex;
        justify-content: space-around;
    }

    .box_mini {
        width: 250px;
        height: 200px;
        background: #5ec7ff;
        box-shadow: 0 0 4px #000;
        transition: all 0.5s ease;
    }

    .box_icon {
        font-size: 25px;
        margin: 10px 45% 6px;
        color: #7f7f7f;
    }

    .title_box {
        font-size: 45px;
        margin: 25px 0;
        color: #f9ff4d;
        text-align: center;
        display: none;
    }

    .background{
        background: #c9e955;
        transition: all 0.5s ease;
    }
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css" rel = "stylesheet" />
<section class = "box_main">
  <div class = "box_mini">
    <i class = "bi bi-play-circle-fill  box_icon"></i>
    <h1 class = "title_box">Title BOX</h1>
  </div>
  <div class = "box_mini">
    <i class = "bi bi-play-circle-fill  box_icon"></i>
    <h1 class = "title_box">Title BOX</h1>
  </div>

  <div class = "box_mini">
    <i class = "bi bi-play-circle-fill  box_icon"></i>
    <h1 class = "title_box">Title BOX</h1>
  </div>

  <div class = "box_mini">
    <i class = "bi bi-play-circle-fill  box_icon"></i>
    <h1 class = "title_box">Title BOX</h1>
  </div>

</section>
document.querySelector(".box_mini") - выбирает только первый элемент с этим классом. $(mini).ready(function () - это не имеет смысла для начала. Почему произвольный элемент div должен запускать любое «готовое» событие?
CBroe 13.02.2023 12:30
$(mini).ready(function () { $(this).toggleClass('background'); }) -> $(this).closest(".box_mini").toggleClass('background'); удалите готовое изворотливое и используйте .closest, чтобы получить родительский .box_mini
freedomn-m 13.02.2023 12:35

Я бы придерживался нативного JS или jQuery. Их смешение приводит к запутанному коду.

Andy 13.02.2023 12:39

Может быть, я не понимаю, что именно вы хотите, но почему вы используете forEach()...?

Juan 13.02.2023 12:43

@Juan, вы можете назначить обработчик события только одному элементу в vanilla-javascript, поэтому вам нужен foreach после document.querySelectorAll, чтобы перебрать каждый элемент в возвращаемой коллекции, чтобы назначить обработчик события. Это не похоже на jquery, который одинаково обрабатывает как коллекции, так и отдельные элементы (коллекции с одним элементом). Вот пример: stackoverflow.com/a/40956816/2181514

freedomn-m 13.02.2023 12:58

В принципе, я не понимал, почему forEach следует использовать в решении, которое должно использовать JQuery. А вот с вашими данными на Vanilla JS понятнее.

Juan 13.02.2023 13:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, вы слишком сильно путаете jQuery с нативным js.

Почему бы просто не придерживаться jQuery вот так?


Редактировать, я бы установил cursor:pointer; на ваш класс .bi, чтобы выделить интерактивный контекст.

$('body').on('click','.bi-play-circle-fill',function(){
  $(this).next('.title_box').show();
  $(this).removeClass('bi-play-circle-fill').addClass('bi-power');
  $(this).parent().addClass('background');
});

$('body').on('click','.bi-power',function(){
  $(this).next('.title_box').hide();
  $(this).removeClass('bi-power').addClass('bi-play-circle-fill');
  $(this).parent().removeClass('background');
});
.box_main {
        display: flex;
        justify-content: space-around;
    }

    .box_mini {
        width: 250px;
        height: 200px;
        background: #5ec7ff;
        box-shadow: 0 0 4px #000;
        transition: all 0.5s ease;
    }

    .box_icon {
        font-size: 25px;
        margin: 10px 45% 6px;
        color: #7f7f7f;
    }

    .title_box {
        font-size: 45px;
        margin: 25px 0;
        color: #f9ff4d;
        text-align: center;
        display: none;
    }

    .background{
        background: #c9e955;
        transition: all 0.5s ease;
    }
    
    .bi{
      cursor: pointer;
    }
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css" rel = "stylesheet" />
<section class = "box_main">
  <div class = "box_mini">
    <i class = "bi bi-play-circle-fill  box_icon"></i>
    <h1 class = "title_box">Title BOX</h1>
  </div>
  <div class = "box_mini">
    <i class = "bi bi-play-circle-fill  box_icon"></i>
    <h1 class = "title_box">Title BOX</h1>
  </div>

  <div class = "box_mini">
    <i class = "bi bi-play-circle-fill  box_icon"></i>
    <h1 class = "title_box">Title BOX</h1>
  </div>

  <div class = "box_mini">
    <i class = "bi bi-play-circle-fill  box_icon"></i>
    <h1 class = "title_box">Title BOX</h1>
  </div>

</section>

Я пытался сохранить это очень похожим на то, что у вас было раньше. Похоже, вы не получили родительский класс .box_mini для изменения цвета фона.

let mini = document.querySelector(".box_mini");


document.querySelectorAll('.box_icon').forEach(eye => {
eye.addEventListener("click", function() {
let excerpt = this.parentNode.querySelector(".title_box");
let parent = $(this).parent();
if (this.classList.contains("bi-play-circle-fill")) {
    this.classList = "bi bi-power box_icon";
    excerpt.style.display = "block";
    parent.toggleClass('background');
} else {
    this.classList = "bi bi-play-circle-fill box_icon";
    excerpt.style.display = "none"
    parent.toggleClass('background');
  }

  });
});  

Я повторяю свой комментарий, опубликованный по исходному вопросу. Зачем использовать forEach..? В то время как вмешательства по изменению класса выполняются только для элемента, по которому щелкнули...?

Juan 13.02.2023 12:54

Другие вопросы по теме