Новые опции для выбора (функция цикла) - PullRequest
0 голосов
/ 25 августа 2018

Я делаю простую функцию, которая добавляет новые опции (число от 0 до 12) с помощью цикла.

Однако в этом списке я вижу только последнюю запись (12), вставленную из всех них.Я проверял на консоли, и там я вижу все числа.

У вас есть идеи, что может быть не так в этом коде?

function loop (j) {
  var j = 0;
  while (j<=12) {
    console.log(j);
    hours.innerHTML = "<option>" + j + "</option>";
    j++;
  };
};

loop();
#alarm {
  height: 200px;
  width: 280px;
  background-color: #dddddd;
  text-align: center;
}
<head></head>
<body>
  <div id="alarm">
    <p>Choose time of alarm ring</p>
    <select id="hours">
    </select>
    <select id="min">
    </select>
  </div>
</body>

1 Ответ

0 голосов
/ 25 августа 2018

Вы не добавляя новые опции, вы заменяете предыдущую новой, потому что вы стираете старый .innerHTML с новым HTML с использованием =.

Если вы используете += вместо =, вы добавите новые опции к существующим.

function loop (j) {
var j = 0;
while (j<=12) {
  //console.log(j);
  hours.innerHTML += "<option>" + j + "</option>";
  j++;
};
};

loop();
#alarm {
  height: 200px;
  width: 280px;
  background-color: #dddddd;
  text-align: center;
}
<head></head>
<body>
  <div id="alarm">
    <p>Choose time of alarm ring</p>
    <select id="hours">
    </select>
    <select id="min">
    </select>
  </div>

</body>

Сказав это, есть несколько недостатков в использовании .innerHTML, так как это заставляет анализатор HTML заново анализировать документ, а это расточительно и приводит к снижению производительности. Использование его в цикле еще более расточительно. При использовании .innerHTML могут также возникать проблемы с безопасностью, и привязка к событиям может быть с него сброшена.

Вместо этого рекомендуется использовать DOM API и создавать новые элементы DOM в памяти, а затем добавлять их как единое целое, только один раз, когда цикл завершен.

function loop () {
  // Create a container element in memory only
  var frag = document.createDocumentFragment();

  // While loops can lead to bugs, use for loops instead when possible
  for(i = 1; i < 13; i++) {
    var op = document.createElement("option");  // Create a new DOM element in memory only
    op.textContent = i;                         // Configure the element
    frag.appendChild(op);                       // Append it to the documentFragment
  };
  
  // Now that the loop is done and all the elements have been made,
  // append the elements to the DOM in one batch action
  document.getElementById("hours").appendChild(frag);
};

loop();
#alarm {
  height: 200px;
  width: 280px;
  background-color: #dddddd;
  text-align: center;
}
  <div id="alarm">
    <p>Choose time of alarm ring</p>
    <select id="hours">
    </select>
    <select id="min">
    </select>
  </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...