JavaScript:将一个选择列表复制到另一个选择列表

javascript: copying one select list to another

本文关键字:列表 选择 复制 另一个 一个 JavaScript      更新时间:2023-09-26

我使用以下代码:

var x = document.getElementById("one");
var len = x.options.length;
var y = document.getElementById("two");
for (i = 0; i < len; i++) {
    var option = document.createElement("option");
    option.text = option.value = x.options[i].value;
    y.add(option);
    x.remove(i);
}

但是,我看到以下错误:

Cannot read property 'value' of undefined

第一个列表框中的元素也不会被删除。我错在哪里?

您正在从x.options中删除元素,但是当您这样做时,列表会变小,并且您仍在迭代直到旧的长度值。因此,在某些时候,您将获得一个超过(现已缩短)列表末尾的索引,并且x.options[i]将被undefined。只要x.options[0]存在,您就可以通过迭代来解决此问题,始终从列表中删除第一个元素:

var x = document.getElementById("one");
var y = document.getElementById("two");
while ( x.options[0] ) {
    var option = document.createElement("option");
    option.text = option.value = x.options[0].value;
    y.add(option);
    x.remove(0);
}

或者通过反向迭代:

var x = document.getElementById("one");
var len = x.options.length;
var y = document.getElementById("two");
for (i = len; i--;) {
    var option = document.createElement("option");
    option.text = option.value = x.options[i].value;
    y.add(option,0);
    x.remove(i);
}

迭代数组时从数组中删除元素通常不是一个好主意,因为您可能会丢弃索引。如果您按索引的降序而不是增加顺序浏览元素,则应避免此问题