IE11中AJAX报错:无法获取未定义引用的replace属性求助
replace属性报错问题 我之前也碰到过IE11处理AJAX XML响应的类似坑,这个错误本质是IE11对XML文档的解析和处理逻辑和现代浏览器不一样,导致你获取到的ajax_html是null或undefined,后续调用replace(可能是你代码里其他地方用到,或是jQuery内部逻辑触发)时就触发了报错。
问题根源
Chrome、Firefox等现代浏览器会自动把AJAX返回的XML响应转换成可直接被jQuery处理的DOM对象,但IE11不会——它可能把data当成原始字符串或者未正确解析的对象,导致$(xml).find("#search-ajax-content")找不到目标元素,html()返回null,进而引发replace相关的错误。
具体解决方案
试试下面几个步骤,应该能解决问题:
1. 确保服务器返回正确的Content-Type
先检查你的后端接口返回的HTTP头里,Content-Type是否为application/xml或text/xml。IE11对这个字段非常敏感,如果返回的是text/html或其他类型,它不会把响应当成XML解析,直接导致后续处理失败。
2. 手动解析XML响应
在success回调里手动把响应数据转换成标准的XML DOM对象,再交给jQuery处理:
$.ajax({ type:"GET", dataType:"xml", url:"/search-ajax/" + window.location.search + "&pagination=" + page, success: function(data) { var xml; // 兼容IE11的XML解析逻辑 if (window.DOMParser) { // 现代浏览器和IE11都支持DOMParser var parser = new DOMParser(); xml = parser.parseFromString(data, "text/xml"); } else { // 兼容更老的IE版本(可选,IE11其实不需要,但保险起见可以保留) xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = false; xml.loadXML(data); } if (page == 1) { $("#wait-element-container").remove(); // 加个判断,避免获取不到内容时报错 var ajax_html = $(xml).find("#search-ajax-content").html(); if (ajax_html) { $("#postload-target").append(ajax_html); } } } });
3. 调整选择器(如果上面的方法没用)
有时候IE11对XML中的id选择器支持有问题,你可以尝试用属性选择器替代#选择器:
var ajax_html = $(xml).find("[id='search-ajax-content']").html();
4. 备选方案:直接返回HTML片段
如果你的需求只是获取#search-ajax-content里的HTML内容,可以考虑让后端直接返回这个片段(而不是包裹在XML里),然后把AJAX的dataType改成html,这样就完全绕开了XML解析的兼容性问题:
$.ajax({ type:"GET", dataType:"html", url:"/search-ajax-html/" + window.location.search + "&pagination=" + page, // 修改接口地址 success: function(data) { if (page == 1) { $("#wait-element-container").remove(); $("#postload-target").append(data); } } });
最后提醒
测试的时候记得清空IE11的缓存,有时候旧的响应缓存会导致你看不到修改后的效果。
内容的提问来源于stack exchange,提问作者Michael

