javascript - 为什么使用cloneNode()时<select>元素的值会重置?

标签 javascript html-select clonenode

我正在创建一个表单,用户可以在其中添加字段。按下按钮即可添加更多输入字段。克隆字段的 ID 后会附加一个数字,以将其与原始字段区分开。

当附加克隆元素时,原始字段中元素中的选定选项将重置为第一个选项。

我编写了一些简化的代码来演示相同的行为:

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);    
}

输入元素保留其值,但选择会重置。除了将选择值存储在单独的变量中之外,是否有办法保留它?或者阻止它被重置?

CodePen 链接:https://codepen.io/whisperV/pen/rXqGNM

最佳答案

问题在于,当您克隆节点时,您实际上会获取其 HTML 标记并从该标记中创建一个新元素。已选<option>它的任何 HTML 属性都不会因被选择而更改,除非您明确这样做(通过为选定的 <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> 的当前值会更容易。 ,并将新的选择标记设置为原始选择的值:

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>

关于javascript - 为什么使用cloneNode()时<select>元素的值会重置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57446051/

相关文章:

javascript - 如何在创建选项时更改选项的背景图像?

jquery - 当选择更改时,如何显示下拉菜单的不显眼的 jQuery 验证消息?

javascript - 如何更改clone.Node中父元素及其所有子元素的id

javascript - 关于 javascript 中的 cloneNode 的问题

javascript - 如何使用自定义名称创建 javascript 对象?

javascript - Bootstrap datepicker 日期突出显示问题

javascript - 克隆元素后在文档中找到原始元素

javascript - 我的 p5.js 代码有时会滞后,我不知道怎么办?

jquery - 显示/隐藏按类别选择选项

Javascript:从内存中删除 element.cloneNode()