У меня есть форма, в которой пользователь может выбрать один из семи дней для каждого из восьми событий. Я нашел код, который должен позволить мне копировать даты из одного выбора в другой, но он удаляет и перемещает все остальные параметры в новый раскрывающийся список выбора вместо копирования всего списка параметров.
var fromSelect = document.getElementById("Sel1");
var toSelect = document.getElementById("Sel2");
toSelect.innerHTML = "";
for (var i = 0; i < fromSelect.options.length; i++) {
toSelect.appendChild(fromSelect.options[i]);
}<div>
<select id = "Sel1">
<option value = "1">06/01/24</option>
<option value = "2">06/02/24</option>
<option value = "3">06/03/24</option>
<option value = "4">06/04/24</option>
<option value = "5">06/05/24</option>
<option value = "6">06/06/24</option>
<option value = "7">06/07/24</option>
</select>
<select id = "Sel2"></select>
</div>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно использовать cloneNode, чтобы создать копию исходных параметров выбора.
var fromSelect = document.getElementById("Sel1");
var toSelect = document.getElementById("Sel2");
toSelect.innerHTML = "";
for (var i = 0; i < fromSelect.options.length; i++) {
toSelect.appendChild(fromSelect.options[i].cloneNode(true));
}<div>
<select id = "Sel1">
<option value = "1">06/01/24</option>
<option value = "2">06/02/24</option>
<option value = "3">06/03/24</option>
<option value = "4">06/04/24</option>
<option value = "5">06/05/24</option>
<option value = "6">06/06/24</option>
<option value = "7">06/07/24</option>
</select>
<select id = "Sel2"></select>
</div>Я думаю, что вы здесь ожидаете .appendChild вставки дочерних узлов (fromSelect.options[i]) в некий «список дочерних узлов». Это сбивает с толку: почему узлы загадочным образом исчезают?
Когда вы используете .appendChild, на самом деле происходит то, что родительский узел дочернего узла устанавливается в родительский узел. Другими словами, parent.appendChild(child) является инверсией child.setParent(parent). Решением этой проблемы является клонирование узла перед установкой дочернего узла родительского узла.
var fromSelect = document.getElementById("Sel1");
var toSelect = document.getElementById("Sel2");
toSelect.innerHTML = "";
for (var i = 0; i < fromSelect.options.length; i++)
{
var clone = fromSelect.options[i].cloneNode(true);
toSelect.appendChild(clone);
}
здесь нет необходимости в цикле. если вам нужны два одинаковых параметра, вы можете передать внутренний HTML-код первого поля выбора второму.
<script>
var fromSelect = document.getElementById("Sel1");
var toSelect = document.getElementById("Sel2");
toSelect.innerHTML = fromSelect.innerHTML
</script>
Вам просто нужно просмотреть параметры в обратном порядке:
for (var i = fromSelect.options.length - 1; i >= 0; i--)
Вы можете запустить фрагмент, чтобы увидеть, как он работает:
<div>
<select id = "Sel1">
<option value = "1">06/01/24</option>
<option value = "2">06/02/24</option>
<option value = "3">06/03/24</option>
<option value = "4">06/04/24</option>
<option value = "5">06/05/24</option>
<option value = "6">06/06/24</option>
<option value = "7">06/07/24</option>
</select>
<select id = "Sel2"></select>
</div>
<script>
var fromSelect = document.getElementById("Sel1");
var toSelect = document.getElementById("Sel2");
toSelect.innerHTML = "";
// for (var i = 0; i < fromSelect.options.length; i++)
for (var i = fromSelect.options.length - 1; i >= 0; i--)
{
toSelect.appendChild(fromSelect.options[i]);
}
</script>Элемент select немного особенный по сравнению с другими элементами HTML, поскольку у него есть список его параметров (свойство options ) и метод add() . Вы можете использовать их в сочетании с методом cloneNode(), чтобы скопировать все параметры.
const form = document.forms.form01;
[...form.Sel1.options].forEach(option => {
let clone = option.cloneNode(true);
form.Sel2.add(clone);
});
// more or less a one-liner:
//[...form.Sel1.options].forEach(opt => form.Sel2.add(opt.cloneNode(true)));<form name = "form01">
<select name = "Sel1">
<option value = "1">06/01/24</option>
<option value = "2">06/02/24</option>
<option value = "3">06/03/24</option>
<option value = "4">06/04/24</option>
<option value = "5">06/05/24</option>
<option value = "6">06/06/24</option>
<option value = "7">06/07/24</option>
</select>
<select name = "Sel2"></select>
</form>Вы должны добавить все параметры от formSelect до toSelect:
var fromSelect = document.getElementById("Sel1");
var toSelect = document.getElementById("Sel2");
toSelect.innerHTML = "";
for (var i = 0; i < fromSelect.options.length; i++) {
var option = fromSelect.options[i].cloneNode(true);
toSelect.appendChild(option);
} <div>
<select id = "Sel1">
<option value = "1">06/01/24</option>
<option value = "2">06/02/24</option>
<option value = "3">06/03/24</option>
<option value = "4">06/04/24</option>
<option value = "5">06/05/24</option>
<option value = "6">06/06/24</option>
<option value = "7">06/07/24</option>
</select>
<select id = "Sel2"></select>
</div>Почему бы не просто это?
Sel2.innerHTML = Sel1.innerHTML;<div>
<select id = "Sel1">
<option value = "1">06/01/24</option>
<option value = "2">06/02/24</option>
<option value = "3">06/03/24</option>
<option value = "4">06/04/24</option>
<option value = "5">06/05/24</option>
<option value = "6">06/06/24</option>
<option value = "7">06/07/24</option>
</select>
<select id = "Sel2"></select>
</div>