sa3*_*386 17 javascript dom internet-explorer-7
我有一些代码这样做:
var changes = document.getElementsByName(from);
for (var c=0; c<changes.length; c++) {
var ch = changes[c];
var current = new String(ch.innerHTML);
etc.
}
Run Code Online (Sandbox Code Playgroud)
这适用于FF和Chrome,但不适用于IE7.大概是因为getElementsByName在IE中不起作用.什么是最好的解决方法?
Jas*_*ing 17
如果你不知道为什么它在IE中不起作用,这里是关于该功能的MSDN文档:
使用getElementsByName方法时,将返回文档中具有指定NAME属性或ID属性值的所有元素.
支持NAME属性和ID属性的元素包含在getElementsByName方法返回的集合中,但具有NAME expando的元素不包含在集合中; 因此,此方法不能用于按名称检索自定义标记.
Firefox允许getElementsByName()检索使用NAME expando的元素,这就是它工作的原因.这是否是一件好事可能需要辩论,但这是它的现实.
因此,一种选择是使用getAttribute()DOM方法来请求NAME属性,然后测试该值以查看它是否是您想要的,如果是,则将其添加到数组中.但是,这需要您遍历页面中的所有节点或至少在子部分内迭代,这不是最有效的.您可以通过使用类似的东西预先约束该列表getElementsByTagName().
另一种方法是,如果你控制页面的HTML,就是给所有感兴趣的元素一个Id,它只是按数字变化,例如:
<div id="Change0">...</div>
<div id="Change1">...</div>
<div id="Change2">...</div>
<div id="Change3">...</div>
Run Code Online (Sandbox Code Playgroud)
然后像这样的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");
Run Code Online (Sandbox Code Playgroud)
当然,这是一个黑客行为,但它可以完成你需要的工作,而不是与其他一些黑客相比效率太低.
如果您正在使用某种类型的JavaScript框架/工具包,那么您的选项要好得多,但我没有时间进入这些细节,除非您表明您正在使用它.就个人而言,我不知道人们如何生活没有之一,他们节省了这么多时间,精力和无奈地说,你买不起不使用一个.