我使用以下代码:
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
第一个列表框中的元素也不会被删除。我哪里错了?
答案 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)
在您迭代数组时,从数组中删除元素通常不是一个好主意,因为您可以抛弃索引。如果按照索引的降序而不是增加来浏览元素,则应该避免此问题