对XMLHTTPRequest的回退支持
Fall-back support for XMLHTTPRequest
我们有一个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()
如预期的 因为 - IE8与"启用原生XMLHTTP支持"禁用通过IE6代码(因为
window.XMLHttpRequest
返回falsey
),但实例化的对象失败,因为它不支持open()
方法(oXML.open('POST', sURL, true);
)
window.XMLHttpRequest
返回falsey
,所以IE6应该使用XML.GetActiveX_XML()
。是否有任何方法我可以张贴我的有效载荷回使用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 */
}
相关文章:
- 什么是HTML5画布标记的回退
- 如何在XHTML中添加jQuery CDN回退
- 当CDN加载失败时,为字体添加一个本地CSS回退
- HTML5 视频的回退图像
- 同时使用回退和 JavaScript.什么是正确的方法
- Javascript “替换”替换回退
- jQuery CDN超时回退
- 悬停状态指针事件:无Javascript回退
- IE8 内联尝试的 SVG 回退
- 设置计时器以等待为flash回退视频播放器加载swfobject脚本
- 函数同时支持回调和返回样式
- 显示不受支持的文件格式的<视频>回退消息
- 大视频.js - 检查浏览器是否支持,背景图像回退
- 如果不支持 svg,则回退到 html-css
- Three.js检测到webgl支持并回退到常规画布
- 不支持的CSS属性的jQuery回退
- 我可以使用Node.js 'mirror'作为JavaScript不支持时的回退
- 对XMLHTTPRequest的回退支持
- 优化器中不支持路径回退(“重新加载”)
- 浏览器不支持的HTML元素的无javascript回退