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

时间:2016-01-22 16:53:41

标签: javascript

我使用以下代码:

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

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

2 个答案:

答案 0 :(得分:2)

您正在从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);
}

答案 1 :(得分:0)

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