Почему мой classList применяется ко всем значкам

У меня есть 3 иконки сердца. Я хочу добавить класс к каждой иконке, класс хранится в Localstorage.

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

const heart = document.querySelectorAll('.icons .fa-heart');
let classr = localStorage.getItem("class");

heart.forEach((x) => {
  if (classr !== null) {
    x.classList.toggle(classr);
  }
  x.addEventListener("click", () => {
    x.classList.toggle("active");
    localStorage.setItem("class", "active");
  });
});

Потому что вы назначаете его всем им в цикле... В вашем коде нет ничего, что устанавливало бы, какой из них активен. Вы просто устанавливаете общий класс.

epascarello 16.02.2023 13:27

@epascarello да, я знаю, но как мне настроить таргетинг, выберите один

swadhin 16.02.2023 13:30

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

epascarello 16.02.2023 13:47

Нужно ли запоминать каждый или можно выбрать только один?

epascarello 16.02.2023 14:39
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
0
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы сохраняете класс в локальном хранилище, но то, что вы хотите сохранить, — это способ идентификации выбранного сердца.

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

(function()
{
  let heartsContainer = document.getElementById('hearts');
  for(let hi = 0; hi < heartsContainer.children.length; hi++)
  {
    let heart = heartsContainer.children[hi];
    
    let gotValue = localStorage.getItem(hi);
    
    if (gotValue !== null && gotValue === 'true')
    {
      heart.classList.toggle('empty');
      heart.classList.toggle('full');      
    }
    
    heart.addEventListener('click', function(e)
    {
      e.target.classList.toggle('empty');
      e.target.classList.toggle('full');
      
      let storedValue = localStorage.getItem(hi);
      
      if (storedValue !== null)
      {
        localStorage.setItem(hi, !(storedValue==='true'));
      }
      else
      {
        localStorage.setItem(hi, true);
      }
    });
  }
})();
.empty::before
{
  content:'♡';
}
.full::before
{
  content:'♥';
}
<div id = "hearts">
<p class = "empty"></p>
<p class = "empty"></p>
<p class = "empty"></p>
</div>

(Фрагмент не будет работать из-за проблем с безопасностью, но вы можете увидеть, как он работает на codepen: https://codepen.io/schmellen/pen/BaOyMmL)

If (storedValue !== null) проверяет, есть ли уже запись в localStorage для этого номера. Если запись не null, то она существует, поэтому ее нужно только переключить.

Если запись не существует (значение равно null), а состояние по умолчанию для сердца «пусто», при первом создании записи запись должна быть true, потому что сердце будет заполнено.

Да, теперь это сработало, но я не понимаю, есть ли еще код, который вы поставили, не могли бы вы объяснить @Matt Ellen

swadhin 17.02.2023 08:44

@swadhin Я обновил ответ. это объяснение помогает?

Matt Ellen 17.02.2023 13:38

Да, я немного понял, сейчас я нахожусь в фазе обучения, поэтому я пытаюсь создать небольшой проект самостоятельно, но всякий раз, когда я пытался, он получал какую-то ошибку, и самая большая проблема в том, что я не знаю, как задать правильный вопрос, и мой плохой английский. почти 3 месяца я пытался выучить js самостоятельно @Matt Ellen

swadhin 18.02.2023 08:34

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