【问题标题】:IE doesn't loop through HtmlCollection properlyIE 无法正确循环 HtmlCollection
【发布时间】:2017-05-18 11:42:52
【问题描述】:

我在一个变量上做了一个 console.log,在 IE 中它回来了

<HtmlCollection length="8">
      <input name="Date_Visit" class="Visitor wmp-calendar hasDatepicker" id="rn_Date_Visit_Visitor_23" required="" type="text"></input>
      <input name="Time_Arrival" class="Visitor" id="rn_Time_Arrival_Visitor_23" required="" type="text" maxlength="50"></input>
      <textarea name="Visitor_Names" class="Visitor" id="rn_Visitor_Names_Visitor_23" rows="5"></textarea>
      <input name="Visitor_Organisation" class="Visitor" id="rn_Visitor_Organisation_Visitor_23" required="" type="text"></input>
      <input name="Host_Name" class="Visitor" id="rn_Host_Name_Visitor_23" required="" type="text" maxlength="50"></input>
      <input name="Host_Collar" class="Visitor" id="rn_Host_Collar_Visitor_23" required="" type="text" maxlength="50"></input>
      <input name="Host_Contact" class="Visitor" id="rn_Host_Contact_Visitor_23" required="" type="text" maxlength="50"></input>
      <input name="Floor_Meeting" class="Visitor" id="rn_Floor_Meeting_Visitor_23" type="text" maxlength="50"></input>
      </HtmlCollection>
</HtmlCollection>

上面是我以前放的

var elements = mainDiv.children[i].getElementsByClassName('Visitor');
console.log(elements);

Chrome 中类似(但有更多细节)

因此,下面的这段代码在 Chrome 中有效,但在 IE 中失败。在 IE 中,它只显示名称,以及第二个 console.log 上的一些随机内容,如“length”、“item”和“namedItem”。 IE11 不显示所有属性名称,只显示第一个。

for (var k in elements) {
    console.log("validateForm 5");
    console.log(" > k: " + k);
    console.log(" > k.search(rn): " + k.search("rn_"));
    if (k.search("rn_") > -1){
        console.log("validateForm 6");
        var temp = k.split("_");
        var key = temp[1]+"_"+temp[2];
        var value = elements[k].value;
        VisitorData[x] = key+"|"+elements[k].value;//.getAttribute("value");
        x++;        
    }
}

有什么建议吗?因此,例如 https://jsfiddle.net/6f0L9ye8/1/ 在 Chrom 中运行良好,它带回了所有内容(包括 HERE、WE 和 GO),但 IE11 没有

【问题讨论】:

  • 什么是elements
  • 对不起 - 应该说。这是我的 HTMLcollection - 已编辑问题
  • For-each over an array in JavaScript? 的几个答案解决了如何正确循环像这样的 array-like 结构。重复?
  • 我不会这么说 - 我的问题是 IE11 只访问第一项/属性,而不是全部,而 Chrome 可以

标签: javascript internet-explorer internet-explorer-11 htmlcollection


【解决方案1】:

for-in 不是用于循环遍历集合中的元素,而是用于循环遍历对象中的属性名称。

要遍历集合,请使用简单的for

for (var k = 0; k < elements.length; ++k) {
    var element = elements[k];
    // ...
}

...或使用forEach from Array.prototype:

Array.prototype.forEach.call(elements, function(element) {
    // ...
});

...或其他几种循环技术中的任何一种。 this question 的答案中概述了几个不仅处理数组(问题的主题)而且处理“类似数组”的结构,例如 DOM 集合。

如果您想访问元素对它们的id 和/或name 执行某些操作,您可以使用上述循环并作用于id 和@ 987654332@ 如果找到。因此,使用您的 jsFiddle 的 HTML,但使用 input 而不是 divname 不是 divs 的有效属性):

var elements = document.getElementsByClassName("Visitor");
Array.prototype.forEach.call(elements, function(element, index) {
    console.log("index = " + index);
    if (element.id) {
       console.log("id = " + element.id);
    }
    if (element.name) {
       console.log("name = " + element.name);
    }
});
<input class="Visitor" id="ONE" name="Here">
<input class="Visitor" id="TWO" name="We">
<input class="Visitor" id="THREE" name="Go">

如果你想要其他属性,你可以使用element.attributes来访问它们。

【讨论】:

  • Chrome 怎么会遍历每个属性? IE 似乎只是挑选出第一个,然后是一些随机的
  • @pee2pee:因为您遇到了未指定的行为,不同的引擎可以实现不同的行为。
  • @pee2pee:答案指导:正确循环。 :-)
  • jsfiddle.net/6f0L9ye8/1 在 IE11 中不起作用,但在 Chrome 中起作用
  • @pee2pee “我正在尝试遍历每个元素” - 这样做的方法是这个答案中描述的,而不是你这样做的方式你的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2014-05-10
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
相关资源
最近更新 更多