IE7中的getElementsByName

我有一些代码这样做:

var changes = document.getElementsByName(from); for (var c=0; c<changes.length; c++) { var ch = changes[c]; var current = new String(ch.innerHTML); etc. } 

这在FF和Chrome中正常工作,但不在IE7中。 大概是因为getElementsByName在IE中不工作。 什么是最好的解决方法?

如果你不知道为什么这不是在IE中工作,这是该函数的MSDN文档 :

当使用getElementsByName方法时,将返回文档中具有指定的NAME属性或ID属性值的所有元素。

同时支持NAME属性和ID属性的元素包含在getElementsByName方法返回的集合中,但具有NAME expando的元素不包含在集合中; 因此,此方法不能用于按名称检索自定义标签。

Firefox允许getElementsByName()检索使用NAME expando的元素,这就是它工作的原因。 不pipe这是不是一件好事™可能是争论,但这是现实。

所以,一个select是使用getAttribute() DOM方法来请求NAME属性,然后testing值以查看它是否是你想要的,如果是,则将其添加到数组中。 然而,这将需要遍历页面中的所有节点,或者至less在一个子节点内进行,这不是最有效的。 你可以通过使用getElementsByTagName()类的东西来预先约束这个列表。

另一种方式来做到这一点,如果你是在控制页面的HTML,是给所有感兴趣的元素一个唯一的编号,例如:

 <div id="Change0">...</div> <div id="Change1">...</div> <div id="Change2">...</div> <div id="Change3">...</div> 

然后有这样的JavaScript:

 // assumes consecutive numbering, starting at 0 function getElementsByModifiedId(baseIdentifier) { var allWantedElements = []; var idMod = 0; while(document.getElementById(baseIdentifier + idMod)) { // will stop when it can't find any more allWantedElements.push(document.getElementById(baseIdentifier + idMod++)); } return allWantedElements; } // call it like so: var changes = getElementsByModifiedId("Change"); 

当然,这是一个黑客攻击,但它会做你需要的工作,而不是比其他一些黑客低效率。

如果你正在使用某种JavaScript框架/工具箱,你的select会好得多,但是除非你指出你正在使用这个框架,否则我没有时间去了解这些细节。 就我个人而言,我不知道人们如何没有一个人生活,他们节省了太多的时间,精力和挫折,你不能不使用一个。

有几个问题:

  1. IE确实令人迷惑的id="" with name=""
  2. name=""不允许在<span>

为了解决,我build议:

  1. 将所有name=""更改为class=""
  2. 像这样改变你的代码:

 var changes = document.getElementById('text').getElementsByTagName('span'); for (var c=0; c<changes.length; c++) { var ch = changes[c]; if (ch.className != from) continue; var current = new String(ch.innerHTML); 

find使用NAME属性的元素并不常见。 我会build议切换到ID属性。

你可以使用jQuery来查找具有特定名称的元素:

  $("*[name='whatevernameYouWant']"); 

这将返回具有给定名称的所有元素。

getElementsByName在IE中支持,但是有bug。 特别是它返回“id”匹配给定值的元素,以及“name”。 不能告诉你是否有没有更多的上下文,代码和实际的错误信息,但你有问题。

一般来说,getElementsByName可能是最好的避免,因为在HTML中的'名称'属性有几个重叠的目的可以混淆。 使用getElementById更可靠。 当专门处理表单字段时,可以更可靠地使用form.elements [name]来检索要查找的字段。

IE中的另一个DOM错误:

错误1: http : //webbugtrack.blogspot.com/2007/08/bug-411-getelementsbyname-doesnt-work.html

错误2: http : //webbugtrack.blogspot.com/2008/04/bug-403-another-getelementsbyname-bugs.html

我已经成功地使用包装来返回元素的数组。 工作在IE 6和7也是如此。 请记住,它不是100%与document.getElementsByName完全相同,因为它不是一个NodeList。 但是对于我所需要的,就是在一个元素数组上运行一个for循环来做简单的事情,比如设置.disabled = true,它就可以工作。

尽pipe这个函数仍然使用getElementsByName,但是如果以这种方式使用的话。 你自己看。

 function getElementsByNameWrapper(name) { a = new Array(); for (var i = 0; i < document.getElementsByName(name).length; ++i) { a.push(document.getElementsByName(name)[i]); } return a; } 

解决方法

  var listOfElements = document.getElementsByName('aName'); // Replace aName with the name you're looking for // IE hack, because it doesn't properly support getElementsByName if (listOfElements.length == 0) { // If IE, which hasn't returned any elements var listOfElements = []; var spanList = document.getElementsByTagName('*'); // If all the elements are the same type of tag, enter it here (eg: SPAN) for(var i = 0; i < spanList.length; i++) { if(spanList[i].getAttribute('name') == 'aName') { listOfElements.push(spanList[i]); } } }