2015-09-22 39 views
1

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

我们已经实现了实例化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()预期
  • IE6预计将在帐户中使用XML.GetActiveX_XML()window.XMLHttpRequest回报falsey
  • IE8与“启用本地XMLHTTP支持”残疾人落空至IE6的代码(因为window.XMLHttpRequest回报falsey),但因为它不支持open()方法实例化对象失败(oXML.open('POST', sURL, true);

有什么办法,我可以张贴我的回酬载使用IE8时,“启用本地XMLHTTP支持”是DISABL ED?

+1

你可以使用老式

标签?我没有看到任何不符合格式的数据(数据方面) – dandavis

+0

您是否尝试过使用字符串'“Microsoft.XMLHTTP”'?例如:'var progIDs = ['Microsoft.XMLHTTP','Msxml2.DOMDocument.6.0','Msxml2.DOMDocument.3.0'];'。如果我没有错,当本机XMLHTTP被禁用时,你必须使用最现代的ActiveX对象。 – Buzinas

+0

@dandavis不幸的是,表单提交并不是一个选项,因为这个示例被简化并且是一个更大的过程的一部分。 –

回答

2

您应该看到,如果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 */ 
} 
+0

布里尔!谢谢你指出这一点。我从“任何ActiveX控件相关”中分离出“本机XMLHTTP支持”。您已经明确指出ActiveXObject('Microsoft.XMLHTTP')提供了对原生XMLHTTP的替代,而其他方法(例如,由IE6使用)的处理方式不同。再次感谢。 –