IE8/9上传失败的根本原因是不支持XMLHttpRequest2,Layui降级为iframe提交,要求服务端返回text/html格式的HTML包裹JSON,且需初始化时声明所有参数、手动赋值隐藏表单,避免裸JSON响应或动态修改data无效。
IE8/9 上传后弹下载框或 response 解析失败
根本原因是 ie8/9 不支持 xmlhttprequest2,layui 会 fallback 到隐藏表单提交(iframe 方式),此时服务端返回必须是 text/html,且响应体只能是纯 html 文本(不能是 json)。若后端仍按现代浏览器逻辑返回 application/json,ie 就会把 json 当作可下载文件触发下载框,或解析失败跳过 done 回调。
- 服务端需根据 UA 或请求特征判断是否为 IE8/9:若命中,返回格式改为
{"code":0,"msg":"ok"},并设Content-Type: text/html - 确保响应体最外层是合法 HTML 结构,不能只返回裸 JSON 字符串,否则 IE 无法提取内容
- 避免在响应中写入 BOM、空格或注释——
iframe内容加载后,Layui 依赖iframe.contentDocument.body.innerHTML提取文本,任何非 HTML 结构都会导致解析为空 - PHP 示例:
echo ''.json_encode(['code'=>0,'msg'=>'ok']).'';,且务必不带header('Content-Type: application/json')
IE8 下动态参数传不到后端
Layui 在 IE8 下不用 FormData,而是靠自动创建的隐藏表单(class 为 layui-upload-form)提交。你在 before 回调里改 this.data 对象,对这个隐藏表单完全无效——它只读取初始化时 data 中定义的键,并生成对应 <input type="hidden"> 元素。
- 初始化时必须声明所有要传的参数,哪怕值为空:
data: {args1: '', args2: ''} - 点击上传按钮前,手动给隐藏表单的 input 赋值:
$('.layui-upload-form input[name="args1"]').val($('#args1').val()) - 注意:IE8 不支持
querySelector和forEach,别在赋值逻辑里用 ES5+ 方法,优先用 jQuery 或原生getElementsByName - 不要调用
obj.config.data = {...}—— 这个对象只影响现代浏览器的FormData构造,IE8 下被忽略
“请求上传接口出现异常”但文件已上传成功
这是 IE8/9 最典型的静默失败现象:文件确实到了服务端,但前端卡在解析响应这步,统一报错“请求上传接口出现异常”,done 不触发,error 也不进(因为 HTTP 状态码是 200,只是内容不可解析)。
- 打开开发者工具 → Network → 找到那个 iframe 请求,点开 Response 标签页,看实际返回的是什么——大概率是 JSON 字符串直接裸露,没包 HTML
- 检查服务端是否对 IE 做了 UA 判断,是否误用了
res.json()(Express)或@ResponseBody(Spring),这些在 IE8/9 下会强制设application/json,触发下载 - 临时加
error回调打印xhr.responseText,确认内容结构;若看到{"code":0,...}直接暴露,说明服务端没做兼容处理 - 切勿依赖
dataFilter——IE8/9 走的是 iframe 分支,dataFilter根本不执行
上传按钮点击后无反应或卡住
不是 JS 报错,而是 IE8 对 input[type="file"] 的 click 事件模拟限制极严。Layui 默认用 JS 触发 click() 来唤起文件选择框,但在 IE8 下常失效,表现为点击无反应、或唤起后选完不触发后续流程。
- 确保绑定上传的元素是真实
<input type="file">,而不是用 div 模拟——IE8 只认原生 file input 的 click - 不要在
click事件里做异步操作(如 AJAX 校验)后再调obj.upload(),IE8 会中断事件流;校验必须同步完成 - 如果用了自定义触发按钮(如
<button>上传</button>),需显式绑定到 file input 上:$('#triggerBtn').click(function(){ $('#realFileInput').click(); }); - 避免在页面加载初期就调
upload.render(),等 DOM ready 且所有 input 已渲染完成再执行
data,其实 IE 根本没读它;你以为返回 JSON 就行,其实 IE 正等着你塞一段 HTML。











