我們有一個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?
你可以使用老式
您是否嘗試過使用字符串'「Microsoft.XMLHTTP」'?例如:'var progIDs = ['Microsoft.XMLHTTP','Msxml2.DOMDocument.6.0','Msxml2.DOMDocument.3.0'];'。如果我沒有錯,當本機XMLHTTP被禁用時,你必須使用最現代的ActiveX對象。 – Buzinas
@dandavis不幸的是,表單提交併不是一個選項,因爲這個示例被簡化並且是一個更大的過程的一部分。 –