2015-09-22 70 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使用)的處理方式不同。再次感謝。 –