我在 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就不会有存在的必要了。。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。