IE11中JSON对象处理异常:是否因停止维护导致?
问题分析与解决方案
你遇到的IE11下JSON解析异常,核心并非IE11完全无法处理JSON对象,而是代码里的几个兼容性问题叠加导致的,我来帮你拆解和解决:
问题根源
非标准JSON解析方法
evalJSON()evalJSON()是Prototype.js这类第三方库的非标准方法,并非浏览器原生API。IE11对这类方法的兼容性支持不佳,很可能在解析时没有正确将JSON字符串转为JS对象,反而把原始字符串当成可遍历对象,导致输出时字符被逐个拆分。for...in遍历的风险- 用
for...in遍历数组会包含原型链上的可枚举属性,IE11中这种行为更明显,可能遍历到非数组元素的项,引发异常处理。 document.querySelectorAll()返回的NodeList在IE11里不是数组,用for...in遍历会拿到length等属性,导致处理非DOM元素时出错。
- 用
补充说明:IE11虽然停止开发,但它原生支持
JSON.parse(),并非完全无法处理JSON对象,只是代码写法没适配它的特性。
修复方案
改成适配IE11的标准写法,核心是替换非标准API、改用安全的遍历方式:
// 先用原生JSON.parse解析响应数组(IE11支持原生JSON) var parsedArray = JSON.parse(responseArray); // 用forEach遍历数组(IE11支持Array.prototype.forEach) parsedArray.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); // 用普通for循环遍历NodeList,避免for...in的问题 for (var i = 0; i < dom_elms.length; i++) { var dom_elm = dom_elms[i]; 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; } } });
额外注意点
- 确保
intlToUsDate函数在IE11中能正常工作,IE11对Intl对象的支持有限,如果该函数依赖现代IntlAPI,需要做兼容处理。 - 若
responseArray已经是解析后的数组(而非字符串),可去掉JSON.parse()步骤,但仍需替换for...in为forEach或普通for循环。
内容的提问来源于stack exchange,提问作者Kevin Davis
相关产品推荐
相关产品推荐

