InnerHTML не обновляет текст

Я был в тупике из-за этой ошибки, когда я не могу обновить innerHTML моих классов li с именами «currMonth» и «currYear». Они должны обновляться функцией OnStart(). Я попытался использовать console.info, и он показал, что значения меняются за кулисами. Было бы здорово, если бы кто-нибудь показал мне, что я делаю не так. Спасибо!

HTML:

<!DOCTYPE html>
<html lang = "en-US">

<head>
  <title title = "O(n)Time"></title>
  <meta charset = "UTF-8">
  <script src = "../js/script.js"></script>
  <link rel = "stylesheet" type = "text/css" href = "../css/styles.css">
</head>

<body>
  <div class = "month">
    <ul>
      <li class = "prev">&#10094;</li>
      <li class = "next">&#10095;</li>
      <li id = "currMonth"></li>
      <li id = "currYear"><span style = "font-size:18px"></span></li>
    </ul>
  </div>
</body>

<ul class = "weekdays">
  <li>Sunday</li>
  <li>Monday</li>
  <li>Tuesday</li>
  <li>Wednesday</li>
  <li>Thursday</li>
  <li>Friday</li>
  <li>Saturday</li>
</ul>

<ul class = "days">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li><span class = "active">10</span></li>
  <li>11</li>
  <li>12</li>
  <li>13</li>
  <li>14</li>
  <li>15</li>
  <li>16</li>
  <li>17</li>
  <li>18</li>
  <li>19</li>
  <li>20</li>
  <li>21</li>
  <li>22</li>
  <li>23</li>
  <li>24</li>
  <li>25</li>
  <li>26</li>
  <li>27</li>
  <li>29</li>
  <li>30</li>
  <li>31</li>
</ul>

</html>

CSS:

ul {
  list-style-type: none;
}

body{
  font-family: Verdana, sans-serif;
}

/* Month header */
.month{
  padding: 70px 25px;
  width: auto;
  background: #1abc9c;
  text-align: center;
}

/* Month list */
.month ul {
  margin: 0;
  padding: 0;
}

.month ul li{
  color: white;
  font-size: 20px;
  text-transform: uppercase;
  letter-spacing: 3px;
}

/* Previous button inside month header */
.month .prev {
  float: left;
  padding-top: 10px;
}

/* Next button */
.month .next {
  float: right;
  padding-top: 10px;
}

/* Weekdays (Sun-Sat) */
.weekdays {
  margin: 0;
  padding: 10px 0;
  background-color: #ddd;
}

.weekdays li {
  display: inline-block;
  width: 13.6%;
  color: #666;
  text-align: center;
}

/* Days (1-31) */
.days {
  padding: 10px 0;
  background: #eee;
  margin: 0;
}

.days li {
  list-style-type: none;
  display: inline-block;
  width: 13.6%;
  text-align: center;
  margin-bottom: 5px;
  font-size: 12px;
  color: #777;
}

/* Highlight of the "current" day */
.days li .active {
  padding: 5px;
  background: #1abc9c;
  color: white !important
}

JS:

//Constants
MONTHS = ["January", "February", "March", "April", "May", "June", "July",
          "August", "September", "October", "November", "December"];

//Variables
  var prevArrow = document.getElementsByClassName('prev');
  var nextArrow = document.getElementsByClassName('next');

OnStart(MONTHS);

//Functions
function OnStart(MONTHS){
  var d = new Date();
  var month = d.getMonth();
  var year = d.getFullYear();

  document.getElementById('currMonth').innerHTML = MONTHS[month];
  document.getElementById('currYear').innerHTML = year;

}
Поведение ключевого слова "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
1
1 162
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

getElementsByClassName() возвращает коллекцию. С этим вы должны использовать правильный индекс.

Изменять:

document.getElementsByClassName('currMonth').innerHTML = MONTHS[month];
document.getElementsByClassName('currYear').innerHTML = year;

К:

document.getElementsByClassName('currMonth')[0].innerHTML = MONTHS[month];
document.getElementsByClassName('currYear')[0].innerHTML = year;

Интересно, я никогда этого не знал. Это все еще не работало, поэтому я попытался изменить li с их собственных классов на их собственные идентификаторы. Это тоже не сработало. Я обновил свой исходный пост, добавив весь свой код вместо того, что я считал актуальным.

Sath 21.04.2018 02:21

@Sath, я проверил ваш обновленный код (с id) и обнаружил, что работает (присвоение значения с помощью части id и innnerHTML), как и ожидалось ... спасибо

Mamun 21.04.2018 06:20

оказывается, что моя функция OnStart() была избыточной. Я поменял его на window.onload = function OnStart(MONTHS){}, и он заработал.

Sath 21.04.2018 14:22

@Sath, рад узнать, что ты в состоянии начать ..... и спасибо, что дали мне знать ..... счастливого кодирования .....

Mamun 21.04.2018 14:42

Вы получаете обратно массив, даже если результат может быть только один, поэтому вам нужно ссылаться на 0-й элемент таким образом.

document.getElementsByClassName('currMonth')[0].innerHTML = MONTHS[month];


document.getElementsByClassName('currYear')[0].innerHTML = year;

Нет, это не массив, это HTMLCollection.

Sebastian Simon 21.04.2018 01:37

заменить .getElementsbyClassName на querySelector

? Это работает?

document.getElementsByClassName('currMonth') возвращает список узлов. вам нужно будет перебрать каждый узел, а затем назначить innerHTML. Вот почему вы не можете назначить это так, как вы это делаете. Вы также можете использовать document.querySelectorAll

let list = document.getElementsByClassName('currMonth');
// list = document.querySelectorAll('.currMonth'); either or
let foo = [].slice.call(list); // convert to array of values from node list

foo.forEach(function(objNode) {
    objNode.innerHTML = "value"
}

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