jQuery Find()和XML在IE中不起作用

Nic*_*ick 5 javascript jquery

我试图使用jQuery来解析内存中的XML文档.除了IE(震撼)之外,这在一切都很好.一些谷歌搜索显示问题很可能是由于IE将我的文档视为HTML而不是XML MIME类型.

有没有办法使我的jQuery implmentation工作或我是否必须检查客户端浏览器并实现IE特定的XML解析?

谢谢!!

function getQAData(xmlData) {
var dataArr = new Array();
$(xmlData).find('item').each(function() {
    dataArr.push({ questionid: $(this).attr("cellID"), answer: $(this).find('answer').text() });
});

return dataArr; // this array is nice and populated in everything but ie
Run Code Online (Sandbox Code Playgroud)

XML示例

    <hwroot>
    <data pid="">
        <item cellID="24_951">
            <question>Are you there?</question>
            <answer>No</answer>
        </item>
        <item cellID="24_957">
            <question>A Question?</question>
            <answer>blah blah blah</answer>
        </item>
</data>
</hwroot>
Run Code Online (Sandbox Code Playgroud)

解:

我的jQuery .find()解决方案不适用于@treeface下面描述的原因.这是我的解决方案:

基于导航器的分支JS代码:(

  if (browserName == "Microsoft Internet Explorer") {
    MsXmlParse(xmlData, dataArr);

} else {
    $(xmlData).find('item').each(function() {
        dataArr.push({ questionid: $(this).attr("cellID"), answer: $(this).find('answer').text() });
    });
}
Run Code Online (Sandbox Code Playgroud)

MsXmlParse的定义

function MsXmlParse(xmlDocument, qarray) {
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
xmldoc.async = "false";
xmldoc.loadXML(xmlDocument);

var itemElements = xmldoc.getElementsByTagName("item");

for (var i = 0; i < itemElements.length; i++) {
    var questionCellID = itemElements[i].getAttributeNode("cellID").nodeValue;
    var answerTxt = itemElements[i].childNodes[1].text;

    qarray.push({ questionid: questionCellID, answer: answerTxt });
}
Run Code Online (Sandbox Code Playgroud)

} //结束msxmlparse

tre*_*ace 5

我在这里看到的问题没有任何问题:

http://jsfiddle.net/treeface/VuwcH/

我的猜测是,在IE中,你首先没有正确地解析你的XML数据,但除非你向我们展示那个xmlData变量的输出,否则无法判断.正如您在我的示例中所看到的,您需要使用除DOMParser对象之外的其他内容才能在IE中正确解析XML字符串.你必须这样做:

xmlData = new ActiveXObject("Microsoft.XMLDOM");
xmlData.async = "false";
xmlData.loadXML(text); //where text is your XML string
Run Code Online (Sandbox Code Playgroud)

编辑:

好的,这里的问题是你的xmlData对象是一串XML吗?您在帖子中提到它是"内存中的XML文档",在这种情况下它会在IE中运行.据我的回答,xmlData实际上是一个字符串,这就是出现问题的地方.IE是唯一一个在HTML节点中放置不兼容HTML的主要浏览器.由于jQuery的XML解析器将提供的字符串包装在一个中div,因此它在IE中出现.jQuery识别出这个bug,他们认为这是一个"无法修复"的问题.

问题在这里:http://bugs.jquery.com/ticket/3143

不修复的原因:检查此链接:http: //api.jquery.com/jQuery#jQuery2 jQuery构造函数仅支持html,而不支持xml.该字符串被刷新为div,这可能是IE爆炸的原因.因为字符串无效html.

特别是这一点:

当HTML比没有属性的单个标签更复杂时,如上例所示,元素的实际创建由浏览器的innerHTML机制处理.在大多数情况下,jQuery创建一个新<div>元素并将元素的innerHTML属性设置为传入的HTML片段.当参数具有单个标记(例如$('<img/>')or)时$('<a></a>'),jQuery使用本机JavaScript createElement()函数创建元素.

传递复杂的HTML时,某些浏览器可能无法生成完全复制所提供的HTML源的DOM.例如,版本8之前的Internet Explorer会将链接上的所有href属性转换为绝对URL,而版本9之前的Internet Explorer将无法正确处理HTML5元素,而无需添加单独的兼容层.

所以我怀疑他们"不会修复"它,因为否则所有其他浏览器的东西都会变得松散.我不确定这个答案的真实性(或者他们决定背后的逻辑质量),但这就是它的方式.

那么......总之(太迟了?)......不,没有简单的方法可以在一条线上处理这个问题.再说一遍,也不应该阻止你使用JSON而不是XML.