【问题标题】:getElementsByName in IE7IE7 中的 getElementsByName
【发布时间】:2010-09-21 16:17:55
【问题描述】:

我有一些代码这样做:

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

【问题讨论】:

    标签: javascript dom internet-explorer-7


    【解决方案1】:

    如果你不知道为什么这在 IE 中不起作用,这里是the MSDN documentation on that function

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

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

    Firefox 允许 getElementsByName() 检索使用 NAME 扩展的元素,这就是它起作用的原因。这是否是一件好事™ 可能存在争议,但事实就是如此。

    因此,一种选择是使用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 框架/工具包,您的选择会好得多,但我没有时间深入了解这些细节,除非您表明您正在使用其中一个。就我个人而言,我不知道没有一个人是如何生活的,他们节省了很多时间、精力和挫折感,以至于你无法使用一个。

    【讨论】:

    • 将 MSDN 文档视为“正确的实现”似乎是一种奇怪的立场。姓名不是身份证。 MSFT 弄错了,大错特错。人们可以争论哪些元素应该有名字,但是返回一个没有名字的元素是很愚蠢的。 (有传言说这是在 IE8 标准模式下修复的)
    • MSDN 文档 is 是 IE 7 的正确实现 - 原始发帖人说 IE7 破坏了他的代码,以防您没有阅读他的帖子。根据文档,OP 将 name 属性作为 expando 属性应用于不允许使用 name 的标签,因此 IE 没有返回它。
    • 我很抱歉,但是在 OP 问题中的 where 是否有 任何提及 设置 名称?我只看到代码说明 OP 正在尝试迭代使用 document.getElementsByName(name) 检索到的项目。我仍然坚持我的说法,.getElementsByName(name) 的实现在 IE 中是不正确的(在所有旧版本中)。
    【解决方案2】:

    有几个问题:

    1. IE 确实将id=""name="" 混淆了
    2. name="" 不允许在 &lt;span&gt; 上使用

    要修复,我建议:

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

    【讨论】:

    • 好的,谢谢。该页面在这里(lwww.dege.ukfsn.org/encrypt/decode.php)它是通过字母频率分析破译代码的简单说明。在 IE 中输入字母时可能需要按 Tab。在 FF 中,return 也一样。
    • 起初我认为这在我的 IE 11 和 IE 8 中都不起作用,但我在 .getElementById() 中的“Id”上的大小写不正确。这个错误我犯过很多次了!但是在修复 my own 错误之后,这在 IE 8 和 IE 11 中都非常有效。感谢您提供的出色解决方案!如果只有 IE wud 和其他浏览器一样好用!我希望Edge没有那么糟糕。时间会证明一切。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 我想知道强制性的 jQuery 答案什么时候会出现,通常它们会在 JavaScript 帖子的几秒钟内出现。
    • 那是因为编写 jQuery 比普通的 javascript 快得多 :)
    【解决方案4】:

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

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

    【讨论】:

    • getElementsByName 如果您查找 NAME 属性实际上是 W3C 规范的一部分的表单字段,它实际上很有用。也就是说,真正使用它是一件罕见的事情。
    【解决方案5】:

    我已经成功地使用了一个包装器来返回一个元素数组。也适用于 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;
    }
    

    【讨论】:

      【解决方案6】:

      解决方法

                      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 (e.g.: SPAN)
                      for(var i = 0; i < spanList.length; i++) {
                          if(spanList[i].getAttribute('name') == 'aName') {
                              listOfElements.push(spanList[i]);
                          }
                      }
                  }
      

      【讨论】:

        【解决方案7】:

        IE 中的另一个 DOM 错误:

        错误 1:Click here

        错误 2:Click here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-08
          • 1970-01-01
          • 2016-01-01
          • 2011-02-28
          • 2011-10-21
          • 2022-01-05
          相关资源
          最近更新 更多