getElementsByTagName返回字符串

时间:2011-04-14 19:54:05

标签: javascript

我的最终目标是获取radiobuttons列表并检查/取消选中它们。这是我的代码:

    for (var radio in document.getElementsByTagName('input')) {
        if(typeof (radio) != "string")
            alert(radio);
    }

永远不会调用alert

对document.getElementsByTagName的调用返回一个从0开始到列表长度的字符串列表,因此它们的所有属性(类型,id等)都是未定义的,我不能对它们做很多事情。< / p>

我在这里做错了吗?为什么不为这些元素返回对象?

这是在firefox 4和chrome中,如果有帮助的话。

3 个答案:

答案 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");
    }
}