为什么使用 cloneNode() 时 <select> 元素的值会重置?
Why does the value of a <select> element reset when using cloneNode()?
我正在创建一个表单,用户可以在其中添加字段。按下按钮并添加更多输入字段。克隆字段的 id 附加了一个数字,以将其与原始字段区分开来。
原始字段中元素的 selected 选项在附加克隆元素时重置为第一个选项。
我写了一些演示相同行为的简化代码:
HTML:
<!DOCTYPE html>
<head>
<script src="cloneTest.js" crossorigin="anonymous"></script>
</head>
<body>
<div id="cloneParent">
<div id="cloneThis">
<select id="cloneTestSelect">
<option value="Option1">Option1</option>
<option value="Option2">Option2</option>
<option value="Option3">Option3</option>
<option value="Option4">Option4</option>
</select>
<label for="cloneTestText">Text Input: </label>
<input type="text" id="cloneTestText">
<label for="cloneTestNumber">Number Input: </label>
<input type="text" id="cloneTestNum">
</div>
</div>
<br>
<h1>Cloned fields: </h1>
<br>
<div id="clonedFields"></div>
<button onclick="cloneIt()">Clone inputs</button>
</body>
Javascript:
function cloneIt(){
let newFields = document.getElementById('clonedFields');
let cloneThis = document.getElementById('cloneThis');
let clonedNode = cloneThis.cloneNode(true);
newFields.parentNode.appendChild(clonedNode);
}
输入元素保留其值,但 select 已重置。有没有办法在将 select 值存储在单独的变量中之外保留它?或者阻止它被重置?
CodePen link: https://codepen.io/whisperV/pen/rXqGNM
问题是,当您克隆一个节点时,您有效地获取了它的 HTML 标记并从该标记中创建了一个新元素。一个 selected <option>
没有任何 HTML 属性响应被 selected 改变,除非你明确地这样做(通过给 select编辑 <option>
一个 selected
属性,并确保没有其他 <option>
标签具有该属性)。
const origSelect = document.querySelector('select');
const options = [...origSelect.options];
origSelect.addEventListener('change', () => {
options.forEach(option => option.removeAttribute('selected'));
options[origSelect.selectedIndex].setAttribute('selected', '');
});
function cloneIt() {
let newFields = document.getElementById('clonedFields');
let cloneThis = document.getElementById('cloneThis');
let clonedNode = cloneThis.cloneNode(true);
clonedNode.querySelector('select').value = origSelect.value;
newFields.parentNode.appendChild(clonedNode);
}
<div id="cloneParent">
<div id="cloneThis">
<select id="cloneTestSelect">
<option value="Option1">Option1</option>
<option value="Option2">Option2</option>
<option value="Option3">Option3</option>
<option value="Option4">Option4</option>
</select>
<label for="cloneTestText">Text Input: </label>
<input type="text" id="cloneTestText">
<label for="cloneTestNumber">Number Input: </label>
<input type="text" id="cloneTestNum">
</div>
</div>
<br>
<h1>Cloned fields: </h1>
<br>
<div id="clonedFields"></div>
<button onclick="cloneIt()">Clone inputs</button>
虽然您可以这样做,但简单地检索 <select>
的当前值并设置新的 select 标签会更容易到 select 的原始值:
const origSelect = document.querySelector('select');
function cloneIt() {
let newFields = document.getElementById('clonedFields');
let cloneThis = document.getElementById('cloneThis');
let clonedNode = cloneThis.cloneNode(true);
clonedNode.querySelector('select').value = origSelect.value;
newFields.parentNode.appendChild(clonedNode);
}
<div id="cloneParent">
<div id="cloneThis">
<select id="cloneTestSelect">
<option value="Option1">Option1</option>
<option value="Option2">Option2</option>
<option value="Option3">Option3</option>
<option value="Option4">Option4</option>
</select>
<label for="cloneTestText">Text Input: </label>
<input type="text" id="cloneTestText">
<label for="cloneTestNumber">Number Input: </label>
<input type="text" id="cloneTestNum">
</div>
</div>
<br>
<h1>Cloned fields: </h1>
<br>
<div id="clonedFields"></div>
<button onclick="cloneIt()">Clone inputs</button>
我正在创建一个表单,用户可以在其中添加字段。按下按钮并添加更多输入字段。克隆字段的 id 附加了一个数字,以将其与原始字段区分开来。
原始字段中元素的 selected 选项在附加克隆元素时重置为第一个选项。
我写了一些演示相同行为的简化代码:
HTML:
<!DOCTYPE html>
<head>
<script src="cloneTest.js" crossorigin="anonymous"></script>
</head>
<body>
<div id="cloneParent">
<div id="cloneThis">
<select id="cloneTestSelect">
<option value="Option1">Option1</option>
<option value="Option2">Option2</option>
<option value="Option3">Option3</option>
<option value="Option4">Option4</option>
</select>
<label for="cloneTestText">Text Input: </label>
<input type="text" id="cloneTestText">
<label for="cloneTestNumber">Number Input: </label>
<input type="text" id="cloneTestNum">
</div>
</div>
<br>
<h1>Cloned fields: </h1>
<br>
<div id="clonedFields"></div>
<button onclick="cloneIt()">Clone inputs</button>
</body>
Javascript:
function cloneIt(){
let newFields = document.getElementById('clonedFields');
let cloneThis = document.getElementById('cloneThis');
let clonedNode = cloneThis.cloneNode(true);
newFields.parentNode.appendChild(clonedNode);
}
输入元素保留其值,但 select 已重置。有没有办法在将 select 值存储在单独的变量中之外保留它?或者阻止它被重置?
CodePen link: https://codepen.io/whisperV/pen/rXqGNM
问题是,当您克隆一个节点时,您有效地获取了它的 HTML 标记并从该标记中创建了一个新元素。一个 selected <option>
没有任何 HTML 属性响应被 selected 改变,除非你明确地这样做(通过给 select编辑 <option>
一个 selected
属性,并确保没有其他 <option>
标签具有该属性)。
const origSelect = document.querySelector('select');
const options = [...origSelect.options];
origSelect.addEventListener('change', () => {
options.forEach(option => option.removeAttribute('selected'));
options[origSelect.selectedIndex].setAttribute('selected', '');
});
function cloneIt() {
let newFields = document.getElementById('clonedFields');
let cloneThis = document.getElementById('cloneThis');
let clonedNode = cloneThis.cloneNode(true);
clonedNode.querySelector('select').value = origSelect.value;
newFields.parentNode.appendChild(clonedNode);
}
<div id="cloneParent">
<div id="cloneThis">
<select id="cloneTestSelect">
<option value="Option1">Option1</option>
<option value="Option2">Option2</option>
<option value="Option3">Option3</option>
<option value="Option4">Option4</option>
</select>
<label for="cloneTestText">Text Input: </label>
<input type="text" id="cloneTestText">
<label for="cloneTestNumber">Number Input: </label>
<input type="text" id="cloneTestNum">
</div>
</div>
<br>
<h1>Cloned fields: </h1>
<br>
<div id="clonedFields"></div>
<button onclick="cloneIt()">Clone inputs</button>
虽然您可以这样做,但简单地检索 <select>
的当前值并设置新的 select 标签会更容易到 select 的原始值:
const origSelect = document.querySelector('select');
function cloneIt() {
let newFields = document.getElementById('clonedFields');
let cloneThis = document.getElementById('cloneThis');
let clonedNode = cloneThis.cloneNode(true);
clonedNode.querySelector('select').value = origSelect.value;
newFields.parentNode.appendChild(clonedNode);
}
<div id="cloneParent">
<div id="cloneThis">
<select id="cloneTestSelect">
<option value="Option1">Option1</option>
<option value="Option2">Option2</option>
<option value="Option3">Option3</option>
<option value="Option4">Option4</option>
</select>
<label for="cloneTestText">Text Input: </label>
<input type="text" id="cloneTestText">
<label for="cloneTestNumber">Number Input: </label>
<input type="text" id="cloneTestNum">
</div>
</div>
<br>
<h1>Cloned fields: </h1>
<br>
<div id="clonedFields"></div>
<button onclick="cloneIt()">Clone inputs</button>