3

多年来,我使用相同的代码片段来创建XMLHttpRequest对象:

var tReq = (function () {
    var tAn;
    if (window.XMLHttpRequest) {
        tAn = new XMLHttpRequest();
    } else if (window.ActiveXObject) try {
        tAn = new ActiveXObject("MSXML2.XMLHTTP");
    } catch (ex) {
        tAn = new ActiveXObject("Microsoft.XMLHTTP");
    }
    return tAn;
}());

我使用该代码已经很长时间了,以至于我不知道它是否仍然是最新的。

这段代码是否仍然XMLHttpRequest在每个浏览器中创建或者现在有更有效的解决方案(要求 jQuery)?

4

3 回答 3

4

我记得大约四五年前使用过这个代码吗?当这项技术刚被开发出来并且仍在争论中(有人记得不要禁用后退按钮的说法吗?),它仍然得到了一些零散的支持。这将在 Firefox 1/2 左右。如果我记得,这起源于一个 MS Outlook 库,用于使 Outlook 客户端响应更快,最终该技术渗透到浏览器中。

话虽如此,最后两行是遗留的;所有现代浏览器都支持并且确实支持 plain XMLHttpRequest,最后两个无论如何仅适用于 IE。以后可能会缩短到HTTPor AsyncRequestor什么的,但事实是,除非你需要支持IE6,否则你真的只需要第一行。

以机智:

要支持 Internet Explorer 7 之前的 Windows Internet Explorer 版本,请使用以下函数获取 XMLHttpRequest 对象。

function getXMLHttpRequest()  {
    if (window.XMLHttpRequest) {
        return new window.XMLHttpRequest;
    }
    else {
        try {
            return new ActiveXObject("MSXML2.XMLHTTP.3.0");
        }
        catch(ex) {
            return null;
        }
    }
}

http://msdn.microsoft.com/en-us/library/ie/ms535874%28v=vs.85%29.aspx

所以,你真的不再需要它了。正如 Truth 所说,随着时间的推移,像 jQuery、Angular 和它们的同类库将把它纳入背景。但是直接访问它也不是问题。

还值得链接到MSDN 的 About Native XMLHTTP,由 RobW 在问题下的评论提供。其要点是组策略或个别 IE 策略可能会禁用 native XMLHttpRequest,因此启用它作为一种解决方法可能仍然有用ActiveX,尽管(至少在这一点上)禁用它似乎有点蜡笔锡纸,同时允许更多“有问题的”ActiveX子系统。对此的一个可能解释是带宽、并发连接或其他一些网络级别的问题。奇怪的。

于 2012-08-26T20:20:56.820 回答
0

实际上(我不敢相信我会这么说),jQuery 可能不是一个糟糕的解决方案。

事实上,jQuery 是为了解决浏览器异常而发明的,它是一种大规模适配器模式的形式。

从这个意义上说,jQuery 的.ajax()方法及其别名非常适合这项工作。

至于您目前拥有的解决方案,对我来说它看起来不错。应该适用于超过 IE7(包括)的所有浏览器。

于 2012-08-26T20:15:02.603 回答
0

你的方法没有错。如果有帮助,我会这样做。

var tReq = (function(window) {
    var a = window,
        b = a.XMLHttpRequest,
        c = a.ActiveXObject,

        if (!b && c) {
            try {
                return new c("MSXML2.XMLHTTP");
            } catch (e) {
                return new c("Microsoft.XMLHTTP");
            }
        }
        return new b();
})(this);​
于 2012-08-26T20:25:23.950 回答