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使用本机JavaScriptcreateElement()
函数创建元素。传递复杂的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; }