IE11中JavaScript数组遍历异常,如何使其表现同Chrome等浏览器一致?
解决IE11中JavaScript数组/类数组遍历的问题
这个问题的核心在于你用了for...in来遍历数组和NodeList,这在IE11里会触发意想不到的行为——因为for...in的设计初衷是遍历对象的可枚举属性,而不是数组的元素或者类数组的DOM集合。
问题根源
- 数组遍历问题:IE11中使用
for...in遍历数组时,会把数组原型链上的所有可枚举属性(比如自定义扩展的方法)也纳入遍历范围;而现代浏览器(Chrome/Firefox/Edge)会自动过滤这些非索引属性,只遍历数组的元素索引。这就是你在IE11中得到奇怪输出的原因——你可能遍历到了非数组元素的属性,而非真正的数组项。 - NodeList遍历问题:
querySelectorAll返回的是NodeList(类数组对象),并非标准数组。IE11用for...in遍历它时,会把length、item这类内置属性也遍历出来,导致你拿到的dom_elm可能不是DOM元素,进而引发错误。
修复方案
替换for...in为更安全的遍历方式,推荐两种写法:
写法1:普通for循环(兼容性最好)
function onResponseReceived(responseArray) { found = true; // 遍历数组:用基于索引的普通for循环 for(var i = 0; i < responseArray.length; i++) { var item = responseArray[i]; if (item.field_number == '5') { item.value = intlToUsDate(item.value); console.log(item.value); } var inputSelector = '[name="input_' + item.field_number + '"]'; var dom_elms = document.querySelectorAll(inputSelector); // 遍历NodeList:同样用普通for循环 for (var e = 0; e < dom_elms.length; e++) { var dom_elm = dom_elms[e]; if (dom_elm.type == 'radio' || dom_elm.type == 'checkbox') { if (dom_elm.value == item.value && !dom_elm.checked) { dom_elm.click(); continue; } } else { dom_elm.value = item.value; } } } }
写法2:forEach遍历(更简洁,需处理类数组转换)
function onResponseReceived(responseArray) { found = true; // 数组直接用forEach(IE11支持数组原生forEach) responseArray.forEach(function(item) { if (item.field_number == '5') { item.value = intlToUsDate(item.value); console.log(item.value); } var inputSelector = '[name="input_' + item.field_number + '"]'; var dom_elms = document.querySelectorAll(inputSelector); // NodeList转成标准数组后再用forEach(IE11不支持NodeList原生forEach) Array.prototype.slice.call(dom_elms).forEach(function(dom_elm) { if (dom_elm.type == 'radio' || dom_elm.type == 'checkbox') { if (dom_elm.value == item.value && !dom_elm.checked) { dom_elm.click(); return; } } else { dom_elm.value = item.value; } }); }); }
额外注意事项
如果responseArray是类数组对象(比如后端返回的非标准数组、DOM集合),需要先将其转换为标准数组后再遍历:
var realArray = Array.prototype.slice.call(responseArray);
内容的提问来源于stack exchange,提问作者Kevin Davis
相关产品推荐
相关产品推荐

