我的最终目标是获取radiobuttons列表并检查/取消选中它们。这是我的代码:
for (var radio in document.getElementsByTagName('input')) {
if(typeof (radio) != "string")
alert(radio);
}
永远不会调用alert
。
对document.getElementsByTagName的调用返回一个从0开始到列表长度的字符串列表,因此它们的所有属性(类型,id等)都是未定义的,我不能对它们做很多事情。< / p>
我在这里做错了吗?为什么不为这些元素返回对象?
这是在firefox 4和chrome中,如果有帮助的话。
答案 0 :(得分:5)
getElementsByTagName
返回一个NodeList
对象,Array
- 就像一样,它将任意数字索引原型化到它上面。
您应该不使用for..in
循环来枚举NodeList
。
为什么?
因为for..in
遍历对象的所有属性,这将导致NodeList
中存在的额外不需要的属性以及任意索引原型
在它上面(顺便说一句,也是属性)。
由于您正在遍历索引,因此保证不会获得除DOMElement
对象之外的任何对象。因此,您不需要typeof
检查。
所以,我认为你打算这样做:
var els = document.getElementsByTagName('input');
for(var i = 0, j = els.length; i < j; i++) {
alert(els[i]);
}
或者,您也可以这样做,但我不推荐它:
var els = document.getElementsByTagName('input');
for(var index in els) {
if(els.hasOwnProperty(index) && typeof index === 'number') {
//we have an element
alert(els[index]);
}
}
答案 1 :(得分:1)
尝试使用普通for循环。 for(x in obj)循环对象的属性,而不是数组的实际元素。
var els = document.getElementsByTagName("input");
for ( var i=0; i<els.length; i++ ) {
var radio = els[i];
if ( typeof(radio) != "string" ) {
alert(radio);
}
}
答案 2 :(得分:1)
<强> Live Demo 强>
正如其他人所说,getElementsByTagName
会返回一个NodeList
对象,您需要以不同方式迭代它。以下是实现检查/取消选中无线电的最终目标的一些方法。
使用jQuery
$.each($('input[type="radio"]'), function () {
if (true) // Your condition for checking true
$(this).attr('checked','checked');
else
$(this).removeAttr('checked');
});
没有jQuery
var inputs = document.getElementsByTagName('input');
for(var i = 0; i < inputs.length; i++){
var input = inputs.item(i);
if(input.type == "radio")
if (true) // Your condition for checking true
input.checked = "checked";
else
input.removeAttribute("checked");
}
}