ie9下layui.upload无法获取json响应、弹出下载框、done回调失效,根本原因是ie9将content-type: application/json误判为可下载资源,必须设为text/html且返回纯json字符串,同时确保同域、无bom、es5兼容。
ie9下layui.upload无法获取json响应、弹出下载框、done回调失效——根本原因是ie9对content-type的解析逻辑与现代浏览器不同,不是框架bug,而是http响应头与ie渲染引擎的交互缺陷。
IE9上传后弹出文件下载框?检查后端Content-Type必须是text/html
IE9(及IE8)会把Content-Type: application/json当成可下载资源,哪怕返回的是合法JSON字符串,也会触发下载框。这不是前端能绕过的限制。
- 后端必须将响应头设为
Content-Type: text/html; charset=utf-8 - 返回体必须是纯JSON字符串(不能是Map/Object,必须是
"{\"code\":0,\"msg\":\"ok\"}"这种格式) - 如果用了Spring Boot,避免用
@ResponseBody直接返回对象,改用ResponseEntity<string></string>手动序列化 - Node.js(如Express)需显式设置:
res.set('Content-Type', 'text/html; charset=utf-8').send(JSON.stringify({code: 0}))
done回调收不到res?IE9不支持XDomainRequest,确保同域且禁用crossDomain
IE9的XMLHttpRequest对responseText解析有缺陷,尤其当服务端返回带BOM或换行的JSON时,layui.upload内部的JSON.parse会静默失败。
下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。
- 不要在IE9中启用
crossDomain: true(它实际会降级到XDomainRequest,而该API不支持getResponseHeader和responseText) - 确保前后端完全同域(协议、域名、端口三者一致),否则IE9会直接拒绝请求
- 后端返回JSON前,用
JSON.stringify再序列化一次,确保无多余空格、BOM、不可见字符 - 可在
done回调里加兜底判断:if (typeof res === 'string') try { res = JSON.parse(res); } catch(e) {}
IE9下before和error回调异常?避免使用ES6语法和未polyfill的API
Layui 2.x源码本身已兼容IE9,但如果你在回调里写了箭头函数、const、Array.from等,IE9会直接报错中断上传流程。
- 所有上传相关JS代码必须用ES5写法:用
var代替const/let,用function代替箭头函数 - 避免在
before里调用obj.getChooseFiles()以外的现代API(如Array.prototype.find) - 若需文件校验,用传统
for循环遍历files,不要用filter或some - 引入
babel-polyfill或至少core-js/stable(仅限全局加载,不要按需)
真正卡住人的从来不是“能不能做”,而是IE9对Content-Type和responseText的双重苛刻要求——漏掉任意一环,上传就变成下载框或静默失败。动手前先抓包确认响应头和响应体原始内容,比反复改前端更有效。










