0

我做过的console.log一个变量,在IE中它与IE不遍历的HTMLCollection正确

<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不支持

+0

什么是'元素'? –

+0

对不起 - 应该说。这是我的HTML集合 - 已编辑问题 – pee2pee

+0

几个答案[*为 - 在JavaScript中的每个数组上* *](http://stackoverflow.com/questions/9329446/for-each-over-an-array-in-javascript )解决了如何通过像这样的类似*数组的结构来正确循环。重复? –

回答

2

for-in不适用于循环集合中的元素,它用于循环访问属性名称一个东西。

要通过收集循环,用一个简单的for

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

...或使用forEachArray.prototype

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

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

如果您要访问的元素做一些与他们id和/或name,你会使用一个回路,如上述,并作用于idname如果找到。因此,使用您的jsfiddle的HTML但随着divinput代替(name不是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">

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

+0

Chrome浏览器如何通过每个属性? IE似乎挑出了第一个,然后是一些随机的 – pee2pee

+0

@ pee2pee:因为你进入了未指定的行为,不同的引擎可以以不同的方式实现。 –

+0

有关如何解决的任何指导? – pee2pee