我在 XMLHTTPRequest 实例对象的 onreadystatechange 回调中给这个实例对象添加一个自定义的方法,用于在最终处理实际业务逻辑的回调中按需重启请求来轮训 ——
function iAJAX() {
if (self.ActiveXObject) {
var MS_Version = [
'MSXML2.XMLHttp.6.0',
'MSXML2.XMLHttp.5.0',
'MSXML2.XMLHttp.4.0',
'MSXML2.XMLHttp.3.0',
'MSXML2.XMLHttp',
'Microsoft.XMLHttp'
];
for (var i = 0; i < MS_Version.length; i++) try {
return new ActiveXObject( MS_Version[i] );
} catch (iError) { }
} else try {
return new XMLHttpRequest();
} catch (iError) { }
}
self.iHTTP = function (URL, Data, Callback, TimeOut_Seconds, TimeOut_Callback) {
var This_Call = arguments;
var HTTP_Client = iAJAX(), TimeOut_Loop;
HTTP_Client.open(Data ? 'POST' : 'GET', URL, true);
if (Data) HTTP_Client.setRequestHeader(
'Content-Type', 'application/x-www-form-urlencoded'
);
HTTP_Client.onreadystatechange = function () {
if (HTTP_Client.readyState != 4) return;
clearTimeout( TimeOut_Loop );
var iResponse = HTTP_Client.responseText.trim();
// 自定义 轮训方法
HTTP_Client.retry = function (Wait_Seconds) {
setTimeout(
function () {
This_Call.callee.apply(BOM, This_Call);
},
(Wait_Seconds || 1) * 1000
);
};
Callback.call(HTTP_Client, iResponse);
HTTP_Client = null;
};
HTTP_Client.send(
(typeof Data == 'string') ? Data : JSON.stringify(JSON)
);
TimeOut_Loop = setTimeout(function () {
HTTP_Client.onreadystatechange = null;
HTTP_Client.abort();
TimeOut_Callback.call(HTTP_Client);
}, TimeOut_Seconds * 1000);
};
上述代码在 现代浏览器中运行良好,但 IE 8 内核下走到调用自定义轮训方法的地方就报错 —— 对象不支持此属性或方法……
网上各种 Google 都没结果,难道是因为 IE ActiveXObject() 创建的是 COM 对象(不是 JavaScript 运行时原生对象),不支持 JS Object() 键值对式的成员自定义?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你可以用对象对xhr进行封装,然后在对象里面做自定义方法。变通一下嘛
我也想过自己用JS原生对象包装一层,但JS1.5标准中对象没有getter、setter,不能自动同步属性变化……(自定义公开的getter、setter的话,还要保持调用时的一致,那新老浏览器的XHR对象都得包装一层,增加复杂度……)你不是自己都说出来了吗。还来问呀。
不要用JS标准说是。IE本来就不遵照标准行事的。要不然jQuery就不会有存在的必要了。。