IE7 中的 getElementsByName

IT技术 javascript dom internet-explorer-7
2021-01-24 21:40:56

我有一些代码这样做:

 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 中不起作用。最好的解决方法是什么?

6个回答

如果您不知道为什么这在 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>

然后有这样的 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");

当然,这是一种 hack,但它可以完成您需要的工作,并且与其他一些 hack 相比效率不会太低。

如果您正在使用某种 JavaScript 框架/工具包,那么您的选择要好得多,但除非您表明正在使用,否则我没有时间深入探讨这些细节。就个人而言,我不知道人们如何生活没有之一,他们节省了这么多时间,精力和挫折,你不能承受来使用的。

我很抱歉,但其中在OP的问题是有没有提到设置叫什么名字?我只看到代码说明 OP 试图迭代使用document.getElementsByName(name). 我仍然坚持我的声明,即.getElementsByName(name)IE中的实现是不正确的(在所有旧版本中)。
2021-03-19 21:40:56
MSDN 文档IE 7 的正确实现 - 原始海报说 IE7 破坏了他的代码,以防您没有阅读他的帖子。根据文档,OP 将 name 属性作为 expando 属性应用于不允许名称的标签,因此 IE 没有返回它。
2021-03-29 21:40:56
将 MSDN 文档视为“正确的实现”似乎是一种奇怪的立场。姓名不是身份证。MSFT 搞错了,大错特错。人们可以争论哪些元素应该有名字,但返回一个没有名字的元素只是很愚蠢。(有传言说这是在 IE8 标准模式下修复的)
2021-04-05 21:40:56

有几个问题:

  1. IE的确混淆id=""name=""
  2. name="" 不允许 <span>

要修复,我建议:

  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);
起初我不认为这在我的 IE 11 或 IE 8 中起作用,但是我的大写字母在 .getElementById() 中的“Id”上不正确。我已经犯过很多次这样的错误了!但是在修复了我自己的错误之后,这在 IE 8 和 IE 11 中都很好用。感谢您提供出色的解决方案!如果只有 IE wud 和其他浏览器一样工作就好了!我希望Edge没有那么糟糕。时间会告诉我们的。
2021-03-13 21:40:56
非常感谢。该页面在这里(lwww.dege.ukfsn.org/encrypt/decode.php)它是通过字母频率分析破解密码的简单说明。当您在 IE 中输入字母时,您可能需要点击 Tab。在 FF 中,返回也一样。
2021-04-09 21:40:56

使用 NAME 属性查找元素并不常见。我建议切换到 ID 属性。

但是,您可以使用 jQuery 查找具有特定名称的元素:

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

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

我想知道强制性 jQuery 答案何时会出现,通常它们会在 JavaScript 帖子的几秒钟内出现。
2021-03-17 21:40:56
那是因为编写 jQuery 比普通的 javascript 快得多:)
2021-03-24 21:40:56

IE 支持 getElementsByName,但存在错误。特别是它返回“id”与给定值以及“name”匹配的元素。如果没有更多的上下文、代码和实际的错误消息,就无法判断这是否是您遇到的问题。

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

如果您查找 NAME 属性实际上是 W3C 规范一部分的表单字段,则 getElementsByName 实际上很有用也就是说,真正使用它是一件罕见的事情。
2021-03-21 21:40:56

我已经成功使用包装器返回元素数组。也适用于 IE 6 和 7。请记住,它与 document.getElementsByName 并非 100% 完全相同,因为它不是 NodeList。但是对于我需要它的目的,即只是在元素数组上运行 for 循环来执行简单的操作,例如设置 .disabled = true,它运行良好。

尽管此函数仍然使用 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;
}