低版本ie需用activexobject创建ajax对象,应按“microsoft.xmlhttp→msxml2.xmlhttp.6.0→msxml2.xmlhttp.3.0→msxml2.xmlhttp”优先级try-catch探测,避免硬写单一名称导致失败。

低版本 IE(如 IE6–IE8)不支持 XMLHttpRequest,必须用 ActiveXObject 创建 Ajax 对象。关键不是“怎么写”,而是“怎么安全地选对组件名并兜底”。
低版本 IE 支持的 ActiveXObject 组件名
IE 早期版本对 XMLHTTP 的封装有多个变体,常见且实际可用的包括:
-
"Microsoft.XMLHTTP"—— 最通用,IE5.0+ 都支持,首选 -
"MSXML2.XMLHTTP.6.0"—— 更高安全性与功能(如支持 HTTPS 证书验证),IE7+ 可用 -
"MSXML2.XMLHTTP.3.0"—— 兼容性更广,部分老旧企业内网环境仍依赖它 -
"Msxml2.XMLHTTP"(无版本号)—— 有时可 fallback,但不稳定,不推荐单独使用
用 try-catch 主动探测最稳妥
硬写某个固定名称容易失败(比如某些 IE6 环境缺失 MSXML6)。正确做法是按优先级逐个尝试创建,捕获异常后继续下一个:
function createXhr() {
if (typeof XMLHttpRequest !== 'undefined') {
return new XMLHttpRequest();
}
// IE6/7/8 进入这里
const versions = [
'Microsoft.XMLHTTP',
'MSXML2.XMLHTTP.6.0',
'MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP'
];
for (let i = 0; i
<h3>注意 readyState 和 status 的判断逻辑</h3>
<p>用 <code>ActiveXObject</code> 时,<code>onreadystatechange</code> 仍有效,但需注意:</p>
-
readyState === 4表示请求完成(无论成功或失败) -
status可能为 0(如跨域被拦截、本地 file:// 协议)、12029(网络错误)等非标准值,不能只判=== 200 - 建议用
status >= 200 && status 或正则 <code>/^2\d{2}$/.test(status)判断成功 - 若
status === 0且responseText为空,大概率是跨域或协议限制(如 file://)
额外兼容细节不能漏
仅创建对象还不够,低版本 IE 还有这些典型问题:
-
Content-Type 自动识别失效:服务器返回 JSON 时,IE6–7 不会自动解析
responseText,需手动JSON.parse()(要引入 json2.js 或自行兼容) -
缓存策略不同:GET 请求默认强缓存,可在 URL 后加时间戳或设置
request.setRequestHeader('If-Modified-Since', '0') -
overrideMimeType 不支持:IE 中调用
xhr.overrideMimeType()会报错,需包裹在 try-catch 中 -
中文乱码:确保服务器返回头含
Content-Type: text/plain; charset=utf-8,否则 IE 可能按 GBK 解析
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











