ie9及以下不支持xmlhttprequest.upload和formdata,必须用隐藏iframe模拟异步上传;检测需用typeof formdata !== 'undefined'和'upload' in new xmlhttprequest(),任一为false即降级。

IE9 及以下根本没 XMLHttpRequest.upload 和 FormData
不是“不支持进度”,而是连上传用的底层 API 都不存在。常见报错:Object doesn't support this property or method 'FormData' 或 Access is denied(尤其在跨域 iframe 场景)。XMLHttpRequest 在 IE9 里有,但 upload 属性、append(file) 方法全都没定义。所以别试图 polyfill,直接换方案。
IE6–IE9 必须用隐藏 <iframe></iframe> 模拟异步上传
核心是把表单提交目标设为同域隐藏 iframe,后端返回可执行 JS 回调父页。关键约束有:
-
<form></form>必须设enctype="multipart/form-data"和target="xxx",且<iframe name="xxx"></iframe>要同域 - 后端响应不能是纯 JSON,得包裹在
<script></script>里,例如:<script>parent.handleUploadResponse({success:true})</script> - 避免
document.write,推荐用parent.window[callbackName]+ 白名单校验函数名,防 XSS - IE8 及以下不支持
addEventListener,绑定hashchange或 iframe load 事件得用attachEvent
如何可靠判断该走 XHR 还是 iframe 分支
别看 navigator.userAgent,它不可信。真实可用的检测逻辑只有两个:
typeof FormData !== 'undefined'!!window.XMLHttpRequest && 'upload' in new XMLHttpRequest()
两个都为 true 才走 XMLHttpRequest + FormData;任一为 false,就降级到 iframe 方案。这个判断必须在用户选文件后、发起上传前执行,不能写死在页面加载时——某些 IE10+ 的兼容模式会动态禁用 API。
progress 标签在 IE 中显示空白的真正原因
不是样式问题,是类型校验失败。IE 对 <progress></progress> 的 value 和 max 属性极其敏感:
-
max必须是字符串数字(如max="100"),但value必须是 JS 数字(el.value = 65),不能用setAttribute('value', '65') - 如果
max是字符串而value是数字,IE 直接渲染空白条 - IE 不支持
::-webkit-progress-value等伪元素,所有样式定制只能靠外层容器控制宽高和圆角
真要兼容 IE9,<progress></progress> 只能当占位符,实际进度数值和动画得用 <div> + CSS width 模拟,否则白屏风险极高。</div>
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











