低版本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 < versions.length; i++) {
try {
return new ActiveXObject(versions[i]);
} catch (e) {
// 忽略失败,继续试下一个
}
}
throw new Error('No ActiveXObject available for AJAX');
}
注意 readyState 和 status 的判断逻辑
用 ActiveXObject 时,onreadystatechange 仍有效,但需注意:
立即学习“Java免费学习笔记(深入)”;
-
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 解析


















