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

我试图使用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 

XML示例

     Are you there? No   A Question? blah blah blah    

解:

我的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() }); }); } 

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 }); } 

} //结束msxmlparse

我对此没有任何问题,你可以在这里看到:

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 

编辑

好的,这里的问题是你的xmlData对象是XML字符串吗? 您在post中提到它是“内存中的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会创建一个新的

元素,并将元素的innerHTML属性设置为传入的HTML片段。当参数有一个标记时,例如$('')$('') ,jQuery使用本机JavaScript createElement()函数创建元素。

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

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

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

jQuery的普通jQuery() / $()函数不解析你以XML格式传递给它的字符串:它假装它是HTML,这一般不起作用。 但是,您可以使用jQuery 1.5的新parseXML方法:

 var xmlDoc = $.parseXML(xmlData); 

IE的所有版本或只是IE7的问题? 我之前遇到过使用jQuery用IE解析XML的困难,修复程序最终使用不同的选择器来获取数据。

忘记寻找物品。 例如,尝试使用“cellID”属性查找所有项目。

解决方法可能是创建元素的shivs 。

它工作正常!!! 试试这个,

镀铬/火狐:

 xml.children[0].childNodes[1].innerHTML 

IE8 + / Safari浏览器:

 xml.childNodes[0].childNodes[1].textContent 

IE8:

 xml.documentElement.childNodes[1].text; 

示例代码在这里,

 var xml = $.parseXML(XMLDOC); Var xmlNodeValue = ""; if(userAgent.match("msie 8.0")){ xmlNodeValue = xml.children[0].childNodes[1].innerHTML; }else{ // IE8+ xmlNodeValue = xml.childNodes[0].childNodes[1].textContent; }