IE没有正确循环通过HtmlCollection

时间:2017-05-18 11:42:52

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

我在一个变量上做了一个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不会

1 个答案:

答案 0 :(得分:2)

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

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

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

...或使用forEach中的Array.prototype

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

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

如果您想访问元素对其id和/或name执行某些操作,您可以使用上述循环并执行{如果找到{1}}和id。因此,使用您的jsFiddle的HTML,但使用name代替inputdiv不是name s的有效属性:

div
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">来访问它们。