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会好得多,但是除非你指出你正在使用这个框架,否则我没有时间去了解这些细节。 就我个人而言,我不知道人们如何没有一个人生活,他们节省了太多的时间,精力和挫折,你不能不使用一个。
有几个问题:
- IE确实令人迷惑的
id=""
withname=""
-
name=""
不允许在<span>
为了解决,我build议:
- 将所有
name=""
更改为class=""
- 像这样改变你的代码:
–
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]); } } }