使用XMLHttpRequest本地file://请求遇Chrome和Firefox问题咨询
本地file://协议下XMLHttpRequest的两个浏览器问题解答
我来帮你拆解这两个本地文件请求的问题,都是浏览器针对file://协议的特殊处理机制,不是Bug哦:
针对Chrome的status始终为0问题
你已经加了--allow-file-access-from-files参数,XHR能成功获取本地文件内容,但this.status一直是0,核心原因是:file://不是HTTP协议。
Chrome不会为本地文件请求返回标准的HTTP状态码(比如200)——毕竟没有后台HTTP服务器来处理请求、生成状态码。当readyState变为4时,只要responseText有有效内容,就说明请求已经成功了。
你的代码里只判断status == 200会漏掉这种本地场景,建议修改判断逻辑兼容两种情况:
xhttp.onreadystatechange = function() { if (this.readyState == 4) { // 兼容HTTP请求(status=200)和本地file请求(status=0但有响应内容) if (this.status == 200 || (this.status == 0 && this.responseText)) { elmnt.innerHTML = this.responseText; } else if (this.status == 404) { elmnt.innerHTML = "Page not found."; } else { elmnt.innerHTML = "请求失败"; } } }
针对Firefox的XML解析错误问题
Firefox返回200状态码,但遇到<script> alert(-1<1); </script>时报错,这不是浏览器Bug,是XML解析的标准语法规则导致的:
当你用XHR请求本地文件时,如果Firefox默认把响应识别为XML(比如文件后缀是.xml,或者浏览器未明确判断为纯文本),XML语法要求所有<符号要么是标签的开始,要么必须转义成<。你脚本里的-1<1中的<没有转义,XML解析器会误以为这是新标签的开始,直接触发语法错误。
解决方法有两种:
- 强制XHR以纯文本方式解析响应,跳过XML语法检查:
xhttp.open("GET", file, true); xhttp.responseType = "text"; // 新增这行,指定响应类型为纯文本 xhttp.send();
- 调整被请求文件的脚本内容,用CDATA块包裹代码,告诉XML解析器这段是纯文本无需解析:
<script><![CDATA[ alert(-1<1); ]]></script>
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

