XMLHttpRequest GET 请求未获数据,需设 responseType='document'并确保跨域许可、MIME类型正确;responseXML为null常见于状态码非200、Content-Type不符或XML语法错误;大XML应避免全量解析,改用XPath或sax流式处理。
XMLHttpRequest 发送 GET 请求时没拿到数据?先检查
默认情况下,
的
是空字符串,此时
是字符串,哪怕你请求的是 XML 文件。浏览器不会自动解析成
,得手动设。
要让
直接是可遍历的 XML 文档对象,必须显式设置
如果设成
或留空,
就是原始字符串,得用
手动解析——但这时容易因编码或格式错误返回
注意:设为
后,跨域请求会失败(除非服务端明确允许
且响应 MIME 类型确实是
或
)
用
解析 XML 响应体时遇到
?看状态码和 MIME 类型
常见现象是
为
,控制台也没报错,但
(IE/旧 Edge)或
异常暴露了问题。
不是
(比如
表示跨域被拦,
表示路径错)——此时
必为
服务端返回的 HTTP
不是
、
或
,现代浏览器会拒绝自动解析,
直接为
XML 内容本身有语法错误(如未闭合标签、非法字符),
也会是
;可用
看原始内容再校验
为什么不用
而坚持用
?兼容性和流式处理是关键
不是为了怀旧,而是有些场景
仍不可替代:
基于jQuery的AJAX和JSON的实例 中文WORD版
本文档主要讲述的是基于jQuery的AJAX和JSON的实例;过jQuery内置的AJAX功能,直接访问后台获得JSON格式的数据,然后通过jQuer把数据绑定到事先设计好的html模板上,直接在页面上显示。有需要的朋友可以下载看看
下载
需要监听上传进度(
)或下载进度(
),
没有原生支持,得靠
+
自己拆流,复杂度高
老系统要求 IE11 支持,
在 IE 全系缺席,而
从 IE5 就存在
需要中途中断请求(
),
得配合
,但部分老安卓 WebView 对其支持不稳
XML 数据量大时卡顿?别直接操作
,改用流式 XPath 或事件解析
把整个 XML 加载进内存再用
或
查找,在几百 KB 以上就明显变慢,尤其在低端 Android 设备上。
避免写
这类全量遍历,改用
配合
(XPath)做懒查
超大 XML(MB 级)建议服务端改用 JSON 流式接口;若必须 XML,前端可用
类库(如
)做事件驱动解析,不加载全文
注意:
会触发浏览器完整 DOM 构建,比
多出数倍内存占用和解析时间
XML 的“解析即加载”特性决定了它没法像 JSON 那样按需提取字段——只要用了
,浏览器就已经在后台完成了解析树构建。这点很容易被忽略。
responseTypeXMLHttpRequestresponseTyperesponseXMLDocumentresponsexmlhttp.responseType = 'document''text'response(new DOMParser()).parseFromString(..., 'text/xml')null'document'Access-Control-Allow-Headers: Content-Typeapplication/xmltext/xmlXMLHttpRequestparseErrorxmlhttp.responseXMLnullxmlhttp.parseErrorxmlhttp.statusxmlhttp.status2000404responseXMLnullContent-Typetext/xmlapplication/xmlapplication/xhtml+xmlresponseXMLnullresponseXMLnullconsole.log(xmlhttp.responseText)fetchXMLHttpRequestXMLHttpRequestupload.onprogressonprogressfetchReadableStreamtee()fetchXMLHttpRequestxmlhttp.abort()fetchAbortControllerresponseXMLgetElementsByTagNamequerySelectorxmlhttp.responseXML.querySelectorAll('item')DOMParserdocument.evaluatesaxsaxesresponseType = 'document''text'responseXML