Обратный отсчет для определенной даты

#javascript #html

#javascript #HTML

Вопрос:

Я хочу создать программу обратного отсчета. Но моя проблема в том, что я не могу получить

 getElementsByClassName
  

для работы (на мой взгляд). ВСЯ программа будет работать, если я использую

 getElementById
  

и измените теги HTML на id=»»…

Весь мой код доступен здесь: https://jsfiddle.net/f1kzL78h/5 /

Мне нужна функция класса, потому что в будущем у меня будет больше p-тегов в моем HTML-файле, и я хочу применить Javascript ко всем моим классам с одинаковыми именами.

HTML:

 <p class="date">2019-04-13</p>
<p class="time">21:21</p>
<p class="appear"></p>
  

JS:

 var articleDate = document.getElementsByClassName("date");
var articleTime = document.getElementsByClassName("time");

var total = articleDate   'T'   articleTime   ':00';

var countDownTime = new Date(total).getTime();

var x = setInterval(function() {

    var timeNow = new Date().getTime();

    var difference = countDownTime - timeNow;

    var days = Math.floor(difference / (1000 * 60 * 60 * 24));
    var hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    var minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60));
    var seconds = Math.floor((difference % (1000 * 60)) / 1000);

    res = days   ":"   hours   ":"   minutes   ":"   seconds;

     document.getElementsByClassName("appear") = res;

}, 1000);
  

Я ценю любую помощь, которую я могу получить.

Комментарии:

1. var total = articleDate 'T' articleTime ':00'; <- что именно вы ожидаете здесь произойти? Также document.getElementsByClassName("appear") = res; недопустимо по многим причинам. См. раздел манипулирование документами из MDN. И особенно innerHTML .

Ответ №1:

Изменить на document.getElementsByClassName("appear")[0].innerHTML = res;

Также обновление для

 var articleDate = document.getElementsByClassName("date")[0].innerHTML;
var articleTime = document.getElementsByClassName("time")[0].innerHTML;
  

Потому document.getElementsByClassName("appear") что только элемент DOM и document.getElementsByClassName возвращаемый массив элементов нуждаются в innerHTML для получения значения.
https://jsfiddle.net/viethien/8mxh0zkr/3 /

Комментарии:

1. Я пробовал это несколько раз. Но проблема здесь в том, что я получаю неверный вывод, например. -7042:-12:-20, но в моем случае это неверно

2. Я понял @HienNguyen . Но я не понимаю, почему это не работает в моем коде, когда я не запускаю его из JsFiddle?

3. Редактировать: решаемая. Спасибо за простое решение @HienNguyen

Ответ №2:

Элементы по классам

document.getElementsByClassName("appear") возвращает коллекцию элементов. Вы можете повторить его с помощью следующего кода

 const appears = document.getElementsByClassName("appear");
for (var i = 0; i < appears.length; i  ) {
  appears.item(i).innerHTML = res;
}
  

Получение дат из HTML

Вы использовали var articleDate = document.getElementsByClassName("date"); который не возвращает ожидаемое значение

Вы должны использовать var articleDate = document.getElementsByClassName("date")[0].innerHTML; , чтобы получить значение внутри вашего элемента

Реализация в вашем случае

 // Fångar upp information om artiklens datum och tid

var articleDate = document.getElementsByClassName("date")[0].innerHTML;
var articleTime = document.getElementsByClassName("time")[0].innerHTML;

var total = articleDate   'T'   articleTime   ':00';

var countDownTime = new Date(total).getTime();

var x = setInterval(function() {

  var timeNow = new Date().getTime();

  var difference = countDownTime - timeNow;
  
  var days = Math.floor(difference / (1000 * 60 * 60 * 24));
  var hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = Math.floor((difference % (1000 * 60)) / 1000);

  res = days   ":"   hours   ":"   minutes   ":"   seconds;

  const appears = document.getElementsByClassName("appear");
  for (var i = 0; i < appears.length; i  ) {
    appears.item(i).innerHTML = res;
  }

}, 1000);  
 <p class="date">2019-04-13</p>
<p class="time">21:21</p>
<p class="appear"></p>  

Комментарии:

1. Почему вывод показывает: -7042:-12:-22:-55? У меня есть дата 2019-04-13. Сегодня 2019-04-12 (Европа). Я должен получить , а не —

Ответ №3:

Измените код следующим образом. Используйте document.getElementsByClassName(«дата»)[0].textContent для получения значения.

 // Fångar upp information om artiklens datum och tid
var articleDate = document.getElementsByClassName("date")[0].textContent;
var articleTime = document.getElementsByClassName("time")[0].textContent;

var total = articleDate   'T'   articleTime   ':00';

var countDownTime = new Date(total).getTime();


var x = setInterval(function() {

  var timeNow = new Date().getTime();

  var difference = countDownTime - timeNow;
  
  var days = Math.floor(difference / (1000 * 60 * 60 * 24));
  var hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
  var minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60));
  var seconds = Math.floor((difference % (1000 * 60)) / 1000);
  
  res = days   ":"   hours   ":"   minutes   ":"   seconds;
  document.getElementsByClassName("appear")[0].textContent = res;

}, 1000);  
 <p class="date">2019-04-13</p>
<p class="time">21:21</p>
<p class="appear"></p>  

Ответ №4:

«Мне нужна функция класса, потому что в будущем у меня будет больше p-тегов в моем HTML-файле, и я хочу применить Javascript ко всем моим классам с одинаковыми именами».

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

 <p class="date">2019-04-13</p>
<p class="time">21:21</p>
<p class="appear"></p>

<p class="date">2019-04-13</p>
<p class="time">10:21</p>
<p class="appear"></p>

setInterval(function() {
  var articleElements = document.getElementsByClassName("date");
  for(var i = 0; i < articleElements.length; i  ) {
    var articleDate = articleElements[i].innerText;
    var articleTime = articleElements[i].nextElementSibling.innerText;
    var total = articleDate   'T'   articleTime   ':00';
    var countDownTime = new Date(total).getTime();

    var elAppear = articleElements[i].nextElementSibling.nextElementSibling;
    elAppear.setAttribute('data-countdown', countDownTime);

    var timeNow = new Date().getTime();
      var difference = countDownTime - timeNow;
      var days = Math.floor(difference / (1000 * 60 * 60 * 24));
      var hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
      var minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60));
      var seconds = Math.floor((difference % (1000 * 60)) / 1000);

      res = days   ":"   hours   ":"   minutes   ":"   seconds;
    elAppear.innerText = res;
  }
}, 1000);
  

Комментарии:

1. В предлагаемом коде вы повторно выполняете вычисления на каждой итерации, пока это один и тот же алгоритм. Вы должны извлечь это за пределы цикла

2. @Weedoze спасибо за ваш комментарий, но, как я уже сказал, «это просто начальная точка»

3. Большое вам спасибо @MarceloVismari. Мне это тоже было нужно, потому что в моем HTML-файле есть цикл for, который генерирует несколько тегов <p> с именами каждого класса. Я делаю это с помощью Python и Flask. Спасибо.