使用 innerHTML 向页面添加新 select 会导致先前添加的 select 元素丢失用户从下拉列表中 select 编辑的任何值
Adding a new select to a page using innerHTML causes previously added select elements to lose any value the user has selected from the dropdowns
我遇到了一个页面的奇怪问题,该页面使用 Javascript DOM 操作 (innerHTML
) 向页面添加了一系列下拉菜单。
我在单击按钮时添加了一个新的下拉菜单,代码与此等效:
html = `<select class="selector">
<option value="">No value selected</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
</select>`;
containerDOMElement.innerHTML += html;
当以这种方式将新的下拉列表添加到页面时,我看到任何其他 selects,其中用户创建了 selection,并清除了它们的值。
我已经在这个 jsfiddle 中重现了这个问题。
要查看问题,请在页面加载后从第一个和第三个下拉菜单中手动 select 选项 B。
现在按 "add another" 并注意第一个和第三个下拉菜单已丢失 selection。
有谁知道为什么会这样,以及如何让下拉菜单在添加新下拉菜单时保持其价值?
这一行:
containerDOMElement.innerHTML += html;
与此行具有相同的功能:
containerDOMElement.innerHTML = containerDOMElement.innerHTML + html;
换个角度看,您会看到整个 HTML 正在重建,因此丢失了当前选择的选项。
相反,要附加 HTML,我们可以使用 insertAdjacentHTML。在你的情况下:
containerEl.insertAdjacentHTML('beforeend', html);
这是您的 JSFiddle 的工作版本:
let existing_options = [
"A","B","C"
];
let containerEl = document.getElementById("container");
let count = 0;
function addSelect(preselectOptionB=false) {
html = `<select class="selector" name=${count}><option value="">No value selected</option>`;
existing_options.forEach(function (dataValue,index)
{
html += `<option value=${dataValue} ${(preselectOptionB && dataValue=="B") ? 'selected="selected"' : ""}>${dataValue}</option>`;
});
html += `</select><br/>`;
count++;
containerEl.insertAdjacentHTML('beforeend', html);
}
function addNewSelectWithNoValue() {
addSelect(false);
}
let button = document.getElementById("addbutton");
button.addEventListener('click', addNewSelectWithNoValue);
// add four initial ones.
addSelect();
addSelect(true);
addSelect();
addSelect(true);
<div id="container"></div>
<hr/>
<button id="addbutton">Add another</button>
我遇到了一个页面的奇怪问题,该页面使用 Javascript DOM 操作 (innerHTML
) 向页面添加了一系列下拉菜单。
我在单击按钮时添加了一个新的下拉菜单,代码与此等效:
html = `<select class="selector">
<option value="">No value selected</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
</select>`;
containerDOMElement.innerHTML += html;
当以这种方式将新的下拉列表添加到页面时,我看到任何其他 selects,其中用户创建了 selection,并清除了它们的值。
我已经在这个 jsfiddle 中重现了这个问题。
要查看问题,请在页面加载后从第一个和第三个下拉菜单中手动 select 选项 B。 现在按 "add another" 并注意第一个和第三个下拉菜单已丢失 selection。
有谁知道为什么会这样,以及如何让下拉菜单在添加新下拉菜单时保持其价值?
这一行:
containerDOMElement.innerHTML += html;
与此行具有相同的功能:
containerDOMElement.innerHTML = containerDOMElement.innerHTML + html;
换个角度看,您会看到整个 HTML 正在重建,因此丢失了当前选择的选项。
相反,要附加 HTML,我们可以使用 insertAdjacentHTML。在你的情况下:
containerEl.insertAdjacentHTML('beforeend', html);
这是您的 JSFiddle 的工作版本:
let existing_options = [
"A","B","C"
];
let containerEl = document.getElementById("container");
let count = 0;
function addSelect(preselectOptionB=false) {
html = `<select class="selector" name=${count}><option value="">No value selected</option>`;
existing_options.forEach(function (dataValue,index)
{
html += `<option value=${dataValue} ${(preselectOptionB && dataValue=="B") ? 'selected="selected"' : ""}>${dataValue}</option>`;
});
html += `</select><br/>`;
count++;
containerEl.insertAdjacentHTML('beforeend', html);
}
function addNewSelectWithNoValue() {
addSelect(false);
}
let button = document.getElementById("addbutton");
button.addEventListener('click', addNewSelectWithNoValue);
// add four initial ones.
addSelect();
addSelect(true);
addSelect();
addSelect(true);
<div id="container"></div>
<hr/>
<button id="addbutton">Add another</button>