在IE 10中转换XML AJAX响应时出错

时间:2012-11-30 20:47:27

标签: javascript jquery xml xslt internet-explorer-10

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

  

Object不支持属性或方法'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有什么问题?

2 个答案:

答案 0 :(得分:8)

这是因为,as of IE 10, XMLHttpRequest.responseXML returns a "native XML document" by default instead of an MSXML document

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

在jQuery的beforeSend函数中分配它:

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设置 - 在尝试设置{{1}时,jQuery无法处理Chrome(以及其他浏览器?)引发的错误无效的值。这需要包含在try / catch中,最好的方法是使用responseType函数。

答案 1 :(得分: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中以保证安全。