2011-04-14 104 views
1

我的最终目标是获取单选按钮列表并检查/取消选中它们。这里是我的代码:getElementsByTagName返回字符串

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

alert永远不会被调用。

对document.getElementsByTagName的调用返回一个从0到列表长度的编号的字符串列表,所以它们的所有属性(类型,ID等)都是未定义的,我无法真正做到。

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

这是在Firefox 4和铬,如果有帮助。

+1

你是不是想如果'document.getElementsByTagName( '输入')。radio'定义找? – Kayla 2011-04-14 19:56:59

回答

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]); 
    } 
} 
+0

'typeof DOMElement'会评估为'string'吗? – 2011-04-14 20:04:28

+1

我认为你的意思是DOM元素的一个'NodeList',与数组有微妙差别 - http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1938918D – 2011-04-14 20:04:41

+0

@Russ Wow ,不敢相信我忘了那件事。更新,谢谢 – 2011-04-14 20:06:43

1

尝试使用正常的循环。 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); 
    } 
} 
+1

这并非完全正确,你可以使用'for ... in'循环遍历数组元素,但是可能会得到比期望更多的元素(由原型链引起)。 – 2011-04-14 20:03:06

+0

顺便说一下,'typeof(radio)'(你可以省略小括号)总会像所有'HTMLElements'一样评估为'object'。 – 2011-04-14 20:12:34

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