对XMLHTTPRequest的回退支持

Fall-back support for XMLHTTPRequest

本文关键字:支持 回退 XMLHTTPRequest      更新时间:2023-09-26

我们有一个web应用程序,它使用本地XMLHttpRequest()将数据发送回我们的服务器。我们的一个大客户端用户似乎在Win7(64位)中运行IE8,并且在他们的浏览器中禁用了"启用原生XMLHTTP支持"。

我们已经实现了实例化ActiveXObject代替XMLHttpRequest的典型场景,以便尝试支持IE6(没有原生XMLHTTP支持;是的,我们仍然有客户端在瘦客户端上运行它!),我希望如果这个复选框选项被关闭,IE8可以利用它作为后备。然而,一旦对象被创建,当调用open()方法时,我得到一个类型错误。

下面是我的代码:

// Posts back an xml file synchronously and checks for parse error.
// Returns xml object or null.  Used in RSUserData.
XML.PostXmlFile = function(sURL, doc)
{
    try
    {
        // Validate Input
        if ((typeof (sURL) != "string") || (sURL == ""))
            return null;
        if (window.XMLHttpRequest)  // IE7+, FF and Chrome
        {
            // Mozilla, create a new DOMParser and parse from string
            // Although IE9 and IE10 can successfully load XML using this block, it can't use document.evaluate nor selectNodes/selectSingleNode to navigate it
            // Ref: http://msdn.microsoft.com/en-us/library/ie/ms535874(v=vs.85).aspx
            // Ref: http://msdn.microsoft.com/en-us/library/ie/ms534370(v=vs.85).aspx
            // Ref: http://blogs.msdn.com/b/ie/archive/2012/07/19/xmlhttprequest-responsexml-in-ie10-release-preview.aspx
            var req = new XMLHttpRequest();
            req.open("post", sURL, false);
            req.send(doc);
            if (req.status != 200)
                throw { message: 'HTTP Post returned status ' + req.status + ' (' + req.statusText + ') when sending to ' + sURL };
            // IE11+:   req.responseXML returns a native XML Document
            // IE9/10:  req.responseXML returns an IXMLDOMDocument2 object but we can convert req.responseText to native XML using DOMParser
            // IE6/7/8: req.responseXML returns an IXMLDOMDocument2 object but DOMParser is not available
            if (window.DOMParser)
            {
                var parser = new DOMParser();
                return parser.parseFromString(req.responseText, 'application/xml');
            }
            else
                return req.responseXML;     // NATIVE
        }
        else
        {
            // up to IE6:
            // Ref: http://blogs.msdn.com/b/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx
            var oXML = XML.GetActiveX_XML();
            if (!oXML)
                throw { message: "Could not instantiate an Msxml2 ActiveXObject", innerException: e };
            oXML.open('POST', sURL, true);
            oXML.send(sFile);
            if (oXML.parseError.errorCode == 0)
            {
                xmlDoc = oXML;
                return xmlDoc;
            }
            return null;
        }
    }
    catch (e)
    {
        var s = "Exception in XML.PostXmlFile(). " + (e.message ? e.message : "");
        throw { message: s, innerException: e };
    }
}

XML.GetActiveX_XML = function()
{
    var progIDs = ['Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.3.0'];
    for (var i = 0; i < progIDs.length; i++)
    {
        try
        {
            var oXML = new ActiveXObject(progIDs[i]);
            var sl = oXML.getProperty("SelectionLanguage");
            if (sl !== "XPath")
                oXML.setProperty("SelectionLanguage", "XPath"); // Changes v3.0 from XSLPattern to XPath
            var ns = "xmlns:rs='" + XML._nsResolver('rs') + "' xmlns:xsi='" + XML._nsResolver('xsi') + "'";
            //          ns = "xmlns:na='http://myserver.com' xmlns:nb='http://yourserver.com'";
            oXML.setProperty("SelectionNamespaces", ns);
            return oXML;
        }
        catch (ex) { }
    }
    return null;
}

指出:

  • 目的是调用XML.PostXmlFile()的url和有效载荷。
  • 现代浏览器使用new XMLHttpRequest()如预期的
  • 因为window.XMLHttpRequest返回falsey ,所以IE6应该使用XML.GetActiveX_XML()
  • IE8与"启用原生XMLHTTP支持"禁用通过IE6代码(因为window.XMLHttpRequest返回falsey),但实例化的对象失败,因为它不支持open()方法(oXML.open('POST', sURL, true);)

是否有任何方法我可以张贴我的有效载荷回使用IE8当"启用原生XMLHTTP支持"被禁用?

您应该先查看Microsoft.XMLHTTP是否可用,然后再检查是否有XMLHttpRequest:

var bActiveX;
try {
  new ActiveXObject('Microsoft.XMLHTTP');
  bActiveX = true;
}
catch(e) {
  bActiveX = false;
}

然后,检查您的if条件:

if (window.XMLHttpRequest || bActiveX) { // IE7+, FF and Chrome
  var req = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
  /* the rest of your code */
}