开发者社区> 问答> 正文

IE 8 内核的 XMLHTTPRequest 实例对象不能添加 自定义成员??报错

  我在 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() 键值对式的成员自定义

展开
收起
爱吃鱼的程序员 2020-06-14 18:18:24 759 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
    @红薯为何这么详尽的问题描述却无人回答……?很多草率的提问却有人回答? @红薯OSC论坛子系统缺一样功能——查询各领域回答较多(且被赞多)的用户,在提问时能像知乎那样邀请一些内行回答~(因为现在只有经常关注论坛、博客的用户才知道自己关注的领域在OSC中谁比较牛……像我这样平时主要“读OSC技术新闻+Google难题+写技术博客”的人,提问时一时都不知该At谁……) 我反正不会

    你可以用对象对xhr进行封装,然后在对象里面做自定义方法。变通一下嘛

    我也想过自己用JS原生对象包装一层,但JS1.5标准中对象没有getter、setter,不能自动同步属性变化……(自定义公开的getter、setter的话,还要保持调用时的一致,那新老浏览器的XHR对象都得包装一层,增加复杂度……)

    你不是自己都说出来了吗。还来问呀。

    不要用JS标准说是。IE本来就不遵照标准行事的。要不然jQuery就不会有存在的必要了。。

    2020-06-14 18:18:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
对象的生命期管理 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载