Как изменить класс на все дивы?

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

Как я могу это исправить?

function revelCards() { 
  var revelCard = document.querySelectorAll('.card'); 
  for (var i = 0; (i < revelCard.length) ; ++i) {
    if (revelCard[i].classList.contains('flipped')){
      revelCard[i].classList.remove('flipped');
    } else {
      revelCard[i].classList.add('flipped');
  }
}

без оператора if?

Martin Homola 11.11.2018 23:38

Что должен делать revelCards()? Должен ли он открывать все карты независимо от их текущего состояния?

shkaper 11.11.2018 23:43

По крайней мере, вам не хватает закрывающей фигурной скобки

vol7ron 12.11.2018 04:01
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
68
3

Ответы 3

Проблема в том, что ваш цикл просто переворачивается в зависимости от текущего CSS. Однако один из них переворачивается вручную, поэтому цикл просто переключает CSS.

Чтобы исправить это, вы можете сохранить перевернутое значение в переменной. Перед тем, как перейти к циклу for, вы можете вручную переключить (сбросить) переменную.

В качестве альтернативы вы можете проигнорировать уже установленное значение. Это означает, что CSS больше не переключается.

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

Вы можете сохранить тот, который перевернут вручную, в переменной, когда он перевернут (нет, точно, как вы это делаете), например: onClick(event){this.flipped = event.target }; , затем в цикле выше просто проверьте if (card!==this.flipped) \\do the class update

dream88 12.11.2018 11:25

Вам следует просто удалить предложение if, например:

function revelCards() { 
  var revelCard = document.querySelectorAll('.card'); 
  for (var i = 0; (i < revelCard.length) ; ++i) {
      revelCard[i].classList.add('flipped');
  }
}

Теперь перевернутые карты останутся перевернутыми, а все остальные перевернуты.

Если я правильно понял, у вас есть набор «карточек», содержимое которых вы хотите показать, а затем скрыть. Если я прав, вы можете попробовать сделать что-то вроде этого:

window.onload = ()=>{
  let btn = document.getElementById('toggle');
  btn.addEventListener('click', ()=>{
    let cards = document.querySelectorAll('.card');
    let flippedCards = [];
    for(let i = 0; i < cards.length; i++){
      // remember all the cards that are already flipped
      if (cards[i].classList.contains('flipped')){
        flippedCards.push(i);
      }
      // flip all the cards
      cards[i].classList.add('flipped');
    }
    // flip all the cards again after 1 second (1000ms)
    setTimeout(()=>{
        for(let i = 0; i < cards.length; i++){
          cards[i].classList.remove('flipped');
        }
        // return the cards to their original state
        flippedCards.forEach(elem =>{
          cards[elem].classList.add('flipped');
        });
    }, 1000);
  });
};
.container {
  display: flex;
  margin-bottom: 5px;
}

.card {
  transition: background-color 0.3s ease-in-out;
  background-color: red;
  width: 50px;
  height: 50px;
  margin-left: 5px;
}

.flipped {
  background-color: green;
}
<div class = "container">
  <div class = "card"></div>
  <div class = "card"></div>
  <div class = "card"></div>
  <div class = "card flipped"></div>
  <div class = "card"></div>
  <div class = "card flipped"></div>
  <div class = "card"></div>
  <div class = "card"></div>
</div>
<input type = "button" value = "flip cards" id = "toggle">

Также вот рабочий пример :)

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