【问题标题】:Best practice for detecting AJAX/XmlHttpRequestSupport检测 AJAX/XmlHttpRequest 支持的最佳实践
【发布时间】:2008-11-21 01:09:21
【问题描述】:

我正在尝试更新用于检测 AJAX 支持的旧 JavaScript 函数(即 XmlHttpRequest 对象)。我在网上查看(包括 SO)并找到了各种解决方案,但我不确定哪种解决方案对于简单地检测支持最有效。

当前函数是:

    function IsSyncAJAXSupported()
    {
        var isSyncAJAXSupported = true;

        var xmlHttp = null;
        var clsids = ["Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
        for(var i=0; i<clsids.length && xmlHttp == null; i++) {
            try {
                    xmlHttp = new ActiveXObject(clsids[i]);
            } catch(e){}
        }

        if(xmlHttp == null && MS.Browser.isIE)
        {
            isSyncAJAXSupported = false;
        }
        return isSyncAJAXSupported;
    }

在 Firefox 3 中,由于 MS 未定义,上述错误。

我意识到使用库会更好,但这不是短期的选择。我们仅支持 IE6 及以上版本 + 最新版本的 Firefox、Safari/WebKit 和 Opera。

为 XmlHttpRequest 支持获取真/假的最佳方法是什么?

【问题讨论】:

    标签: ajax xmlhttprequest


    【解决方案1】:

    不要!

    或者更确切地说,不要浪费时间做许多其他人做得更好的事情。

    尝试获取 jQuery 或类似的源代码并“借用”它们的方法;他们已经投入了时间来支持尽可能多的浏览器(尤其是在 jQuery 的情况下),所以节省您自己的时间。

    HTH

    【讨论】:

    • 这就是 jQuery 的做法,尽管我不确定更改它以使其返回布尔值的最佳方法。 var xhr = window.ActiveXObject ?新的 ActiveXObject("Microsoft.XMLHTTP") : 新的 XMLHttpRequest();
    【解决方案2】:

    我的首选代码是:

    function CreateXMLHttpRequest()
    {
      // Firefox and others
      try { return new XMLHttpRequest(); } catch (e) {}
      // Internet Explorer
      try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
      try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
      //alert("XMLHttpRequest not supported");
      // No luck!
      return null;
    }
    

    您可以轻松地为 Microsoft 对象的变体添加测试...

    【讨论】:

    • 有没有办法做等效但没有尝试/捕获?
    • 另外,你的代码并没有直接回答这个问题——我需要一个布尔值来显示是否有支持,而不是 XmlHttpRequest 实例。
    • 为什么要避免尝试/捕获?无论如何,它们似乎是必要的。而且我的代码返回了一种布尔值:返回值要么是空,要么不是......
    • 如果它们是必要的,那很好,我只是想知道它们是否会对性能产生影响以及是否可以删除它们。我的答案基于您的代码,所以 +1
    【解决方案3】:

    我想出了这个:

    var xhr = null;
    try { xhr = new XMLHttpRequest(); } catch (e) {}
    try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
    try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
    return (xhr!=null);
    

    它似乎有效,所以我想分享它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 2010-10-19
      • 2010-12-22
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多