0

仅在 Internet Explorer 10 中,我在转换从 AJAX 响应返回的 XML 时收到错误:

对象不支持属性或方法“transformNode”

这是我的代码:

function transformXML(xmlUrl, xsl) {
    $.ajax({
        type: 'GET',
        url: xmlUrl,
        success: function (xml, status, xhr) {
            // cross-browser logic omitted for simplicity
            xml.transformNode(xsl);
        },
        dataType: 'xml'
    });
}

这适用于 IE7 - IE9。IE10有什么问题?

4

2 回答 2

8

这是因为,从 IE 10 开始,XMLHttpRequest.responseXML默认返回“本机 XML 文档”而不是 MSXML 文档

您可以通过将属性设置为来强制XMLHttpRequest对象返回 MSXML 对象。不幸的是,这会在 Google Chrome 中中断,因此您需要将其包装在 try/catch 中。responseType"msxml-document"

beforeSend在 jQuery 的函数中分配它:

function transformXML(xmlUrl, xsl) {
    $.ajax({
        type: 'GET',
        url: xmlUrl,
        beforeSend: function (xhr, settings) {
            try { xhr.responseType = "msxml-document"; } catch(err){}
        },
        success: function (xml, status, xhr) {
            // cross-browser logic omitted for simplicity
            xml.transformNode(xsl);
        },
        dataType: 'xml'
    });
}

注意: 不要尝试使用该设置 - 当尝试将 设置为无效值xhrFields时,jQuery 不会处理 Chrome(和其他浏览器?)引发的错误。responseType这需要包含在 try/catch 中,而最好的方法是在beforeSend函数中。

于 2012-11-30T20:47:27.207 回答
1

@mauris:它在 jquery 1.9.1 中被破坏了,因为它们忽略了 responseXML 并从 responseText 创建了一个新的 DOM,这不起作用。

我修改了 jquery 1.9.1(在复制 responseText 之后的第 8570 行附近)

try
{
  var xml = xhr.responseXML;
  if (xml && xml.documentElement)
    responses.xml = xml;
} catch (_) { }

这解决了这个问题。该代码与它在 1.8.3 中所做的相同,它包含在 try/catch 中以确保安全。

于 2013-09-30T02:02:06.027 回答