我试图使用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
我在这里看到的问题没有任何问题:
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使用本机JavaScriptcreateElement()函数创建元素.传递复杂的HTML时,某些浏览器可能无法生成完全复制所提供的HTML源的DOM.例如,版本8之前的Internet Explorer会将链接上的所有href属性转换为绝对URL,而版本9之前的Internet Explorer将无法正确处理HTML5元素,而无需添加单独的兼容层.
所以我怀疑他们"不会修复"它,因为否则所有其他浏览器的东西都会变得松散.我不确定这个答案的真实性(或者他们决定背后的逻辑质量),但这就是它的方式.
那么......总之(太迟了?)......不,没有简单的方法可以在一条线上处理这个问题.再说一遍,也不应该阻止你使用JSON而不是XML.
| 归档时间: |
|
| 查看次数: |
6007 次 |
| 最近记录: |