Мне нужно добавить активный класс к обратному отсчету флип-часов

  • У меня есть часы с обратным отсчетом до нового года
let countDate = new Date('Jan 1, 2021 00:00:00').getTime();

const newYear = () => {
    let now = new Date().getTime();
        gap = countDate - now;
        
        let second = 1000;
        let minute = second * 60;
        let hour = minute * 60;
        let day = hour * 24;

        let d = Math.floor(gap / (day));
        let h = Math.floor((gap % (day)) / (hour));
        let m = Math.floor((gap % (hour)) / (minute));
        let s = Math.floor((gap % (minute)) / (second));

        document.getElementById('day').innerText= d;
        document.getElementById('hour').innerText= h;
        document.getElementById('minute').innerText= m;
        document.getElementById('second').innerText= s;
       
}
setInterval(function(){
    newYear();
},1000)

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

const myItems = document.queryselector('div .item')

const observer = new MutationObserver(mutations => {
    console.info(mutations);
    for(let mutation of mutations) {
        if (mutation.type == 'childList') {
            mutation.target.classList.add('active')
        }else {
            mutation.target.classList.remove('active');
        }
    }
});


observer.observe(myItems, {
    innerText: true,
    childList:true,
    subtree:true,
    characterData:true
});

вот HTML

<div class = "container">
  <h2>We're launching soon</h2>
  <div class = "countdown">
    <div id = "day" class = "item"> <p>00</p></div>
    <div id = "hour" class = "item"><p>00</p></div>
    <div id = "minute" class = "item"><p>00</p></div>
    <div id = "second" class = "item"><p>00</p></div>
  </div>
  <div class = "tex">
    <div>Days</div>
    <div>Hours</div>
    <div>Minutes</div>
    <div>Seconds</div>
  </div>
</div>
<div class = "icons">
  <a href = "#" target = "_blank"><svg xmlns = "http://www.w3.org/2000/svg" width = "24" height = "24"><path id = "fb" fill = "#8385A9" d = "M22.675 0H1.325C.593 0 0 .593 0 1.325v21.351C0 23.407.593 24 1.325 24H12.82v-9.294H9.692v-3.622h3.128V8.413c0-3.1 1.893-4.788 4.659-4.788 1.325 0 2.463.099 2.795.143v3.24l-1.918.001c-1.504 0-1.795.715-1.795 1.763v2.313h3.587l-.467 3.622h-3.12V24h6.116c.73 0 1.323-.593 1.323-1.325V1.325C24 .593 23.407 0 22.675 0z"/></svg></a>
  <a href = "#" target = "_blank"><svg xmlns = "http://www.w3.org/2000/svg" width = "24" height = "24"><path id = "ig" fill = "#8385A9" d = "M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 100 12.324 6.162 6.162 0 000-12.324zM12 16a4 4 0 110-8 4 4 0 010 8zm6.406-11.845a1.44 1.44 0 100 2.881 1.44 1.44 0 000-2.881z"/></svg></a>
  <a href = "#" target = "_blank"><svg xmlns = "http://www.w3.org/2000/svg" width = "24" height = "24"><path id = "pt" fill = "#8385A9" d = "M12 0C5.373 0 0 5.372 0 12c0 5.084 3.163 9.426 7.627 11.174-.105-.949-.2-2.405.042-3.441.218-.937 1.407-5.965 1.407-5.965s-.359-.719-.359-1.782c0-1.668.967-2.914 2.171-2.914 1.023 0 1.518.769 1.518 1.69 0 1.029-.655 2.568-.994 3.995-.283 1.194.599 2.169 1.777 2.169 2.133 0 3.772-2.249 3.772-5.495 0-2.873-2.064-4.882-5.012-4.882-3.414 0-5.418 2.561-5.418 5.207 0 1.031.397 2.138.893 2.738a.36.36 0 01.083.345l-.333 1.36c-.053.22-.174.267-.402.161-1.499-.698-2.436-2.889-2.436-4.649 0-3.785 2.75-7.262 7.929-7.262 4.163 0 7.398 2.967 7.398 6.931 0 4.136-2.607 7.464-6.227 7.464-1.216 0-2.359-.631-2.75-1.378l-.748 2.853c-.271 1.043-1.002 2.35-1.492 3.146C9.57 23.812 10.763 24 12 24c6.627 0 12-5.373 12-12 0-6.628-5.373-12-12-12z"/></svg></a>
</div>

Можете ли вы показать полный пример, включая html?

domenikk 13.12.2020 15:30

Я добавил HTML, обратите внимание: я вроде как новичок, поэтому, если у вас есть какие-либо комментарии или какие-либо предложения, которые могли бы сделать это лучше, пожалуйста, продолжайте.

inKABusser 13.12.2020 19:09
Поведение ключевого слова "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
2
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Одна проблема заключается в том, что вы устанавливаете innerText каждую секунду, поэтому все элементы мутируют.
Во-вторых, вам нужно удалить класс .active, если элемент не является целью мутации.

Попробуйте этот код, если он достигает того, что вы имеете в виду:

let countDate = new Date("Jan 1, 2021 00:00:00").getTime();

const newYear = () => {
  let now = new Date().getTime();
  const gap = countDate - now;

  let second = 1000;
  let minute = second * 60;
  let hour = minute * 60;
  let day = hour * 24;

  let d = Math.floor(gap / day);
  let h = Math.floor((gap % day) / hour);
  let m = Math.floor((gap % hour) / minute);
  let s = Math.floor((gap % minute) / second);

  const dayEl = document.getElementById("day");
  const hourEl = document.getElementById("hour");
  const minuteEl = document.getElementById("minute");
  const secondEl = document.getElementById("second");
  // only set innerText if it changed
  if (dayEl.innerText != d) dayEl.innerText = d;
  if (hourEl.innerText != h) hourEl.innerText = h;
  if (minuteEl.innerText != m) minuteEl.innerText = m;
  if (secondEl.innerText != s) secondEl.innerText = s;
};
setInterval(newYear, 1000);

//

const itemsContainer = document.querySelector(".countdown");
const items = Array.from(document.getElementsByClassName("item"));

const observer = new MutationObserver((mutations) => {
  // clear 'active' class from all items
  items.forEach(el => el.classList.remove("active"));
  // add 'active' for items that mutated
  for (let mutation of mutations) {
    if (mutation.type === "childList") {
      mutation.target.classList.add("active");
    } else {
      mutation.target.classList.remove("active");
    }
  }
});

observer.observe(itemsContainer, {
  innerText: true,
  childList: true,
  subtree: true,
  characterData: true
});

все идеально, за исключением itemsContainer, это вызывает ошибку, что это не узел типа, поэтому я изменил его с div countDown на погружение контейнера, и это сработало просто отлично, большое спасибо за помощь

inKABusser 14.12.2020 11:18

Рад это слышать. Вы можете принять мой ответ как правильный, например: stackoverflow.com/help/someone-answers

domenikk 14.12.2020 11:50

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