Javascript find()不';在IE中不返回数据,但在Firefox和Chrome中返回数据
我帮一个朋友做了一点网络工作。他需要的一部分是一个简单的方法来改变他的网站上的几段文字。我没有让他编辑HTML,而是决定提供一个包含消息的XML文件,并使用jQuery将它们从文件中取出并插入页面 它工作得很好。。。在Firefox和Chrome中,在IE7中没有那么好。我希望你们中的一个能告诉我为什么。我在谷歌上搜索了一段时间,但没有找到我要找的东西 以下是XML:Javascript find()不';在IE中不返回数据,但在Firefox和Chrome中返回数据,javascript,jquery,xml,Javascript,Jquery,Xml,我帮一个朋友做了一点网络工作。他需要的一部分是一个简单的方法来改变他的网站上的几段文字。我没有让他编辑HTML,而是决定提供一个包含消息的XML文件,并使用jQuery将它们从文件中取出并插入页面 它工作得很好。。。在Firefox和Chrome中,在IE7中没有那么好。我希望你们中的一个能告诉我为什么。我在谷歌上搜索了一段时间,但没有找到我要找的东西 以下是XML: <?xml version="1.0" encoding="utf-8" ?> <messages>
<?xml version="1.0" encoding="utf-8" ?>
<messages>
<message type="HeaderMessage">
This message is put up in the header area.
</message>
<message type="FooterMessage">
This message is put in the lower left cell.
</message>
</messages>
此消息显示在标题区域中。
此消息放在左下角的单元格中。
下面是我的jQuery调用:
<script type="text/javascript">
$(document).ready(function() {
$.get('messages.xml', function(d) {
//I have confirmed that it gets to here in IE
//and it has the xml loaded.
//alert(d); gives me a message box with the xml text in it
//alert($(d).find('message')); gives me "[object Object]"
//alert($(d).find('message')[0]); gives me "undefined"
//alert($(d).find('message').Length); gives me "undefined"
$(d).find('message').each(function() {
//But it never gets to here in IE
var $msg = $(this);
var type = $msg.attr("type");
var message = $msg.text();
switch (type) {
case "HeaderMessage":
$("#HeaderMessageDiv").html(message);
break;
case "FooterMessage":
$("#footermessagecell").html(message);
break;
default:
}
});
});
});
</script>
$(文档).ready(函数(){
$.get('messages.xml',函数(d){
//我已经确认它在IE中到达这里
//它加载了xml。
//警报(d);给我一个包含xml文本的消息框
//警报($(d).find('message');给我“[object]”
//警报($(d).find('message')[0]);给我“未定义”
//警报($(d).find('message').Length);给我“未定义”
$(d).find('message').each(function(){
//但在IE中,它永远不会到达这里
var$msg=$(此);
变量类型=$msg.attr(“类型”);
var message=$msg.text();
开关(类型){
案例“校长信息”:
$(“#HeaderMessageDiv”).html(信息);
打破
案例“页脚消息”:
$(“#footermessagecell”).html(消息);
打破
违约:
}
});
});
});
在IE中,我需要做些不同的事情吗?根据带有[object object]的消息框,我假设。find在IE中工作,但由于我无法使用[0]索引到数组或检查其长度,我猜这意味着。find不会返回任何结果。为什么在Firefox和Chrome中可以很好地工作,但在IE中却失败了
我对jQuery完全是个新手,所以我希望我没有做过傻事。上面的代码是从论坛中删掉的,并根据我的需要进行了修改。由于jQuery是跨平台的,我想我不必处理这种混乱局面
编辑:我发现,如果我在VisualStudio2008中加载页面并运行它,那么它将在IE中工作。因此,当通过开发web服务器运行时,它总是工作的。现在我想IE只是不喜欢这样做。在本地驱动器加载的XML中查找,这样当它在实际的web服务器上运行时,它就可以正常工作了
我已经确认,当从web服务器浏览时,它可以正常工作。这一定是IE的一个特点。我猜这是因为web服务器为xml数据文件传输设置了mime类型,没有该类型,IE无法正确解析xml。有时候IE会将换行符作为额外节点读取。尝试删除标签上多余的空白,或者尝试将其作为CDATA进行封装 检查响应的内容类型。如果您将messages.xml作为错误的mime类型,Internet Explorer将不会将其解析为xml 要检查内容类型,您需要访问XMLHttpRequest对象。正常的成功回调不会将其作为参数传递,因此需要添加通用的ajaxComplete或ajaxSuccess事件处理程序。这些事件的第二个参数是XMLHttpRequest对象。您可以对其调用getResponseHeader方法来获取内容类型
$(document).ajaxComplete(function(e, x) {
alert(x.getResponseHeader("Content-Type"));
});
不幸的是,据我所知,在Internet Explorer中无法覆盖服务器发送的内容,因此,如果错误,则需要将服务器更改为发送“text/xml”作为内容类型
$(document).ajaxComplete(function(e, x) {
alert(x.getResponseHeader("Content-Type"));
});
一些浏览器有一个
overrideMimeType
方法,您可以在send
之前调用该方法,强制它使用“text/xml”,但据我所知,Internet Explorer不支持该方法。您可能会发现,如果将数据类型传递到get调用中,它可能会正确地解析为xml。IE的怪癖可能会阻止jQuery将其自动检测为XML,从而导致错误的数据类型被传递到回调函数
<script type="text/javascript">
$(document).ready(function() {
$.get('messages.xml', function(d) {
//I have confirmed that it gets to here in IE
//and it has the xml loaded.
//alert(d); gives me a message box with the xml text in it
//alert($(d).find('message')); gives me "[object Object]"
//alert($(d).find('message')[0]); gives me "undefined"
//alert($(d).find('message').Length); gives me "undefined"
$(d).find('message').each(function() {
//But it never gets to here in IE
var $msg = $(this);
var type = $msg.attr("type");
var message = $msg.text();
switch (type) {
case "HeaderMessage":
$("#HeaderMessageDiv").html(message);
break;
case "FooterMessage":
$("#footermessagecell").html(message);
break;
default:
}
});
}, "xml");
});
</script>
由于IE的问题是其xml解析器阻塞了未使用正确的“text/xml”头传递的xml文件,因此可以在Ajax complete事件中包含一些代码: 完成:功能(xhr,状态) { 警报(“完成。您得到:\n\n”+xhr.responseText); 如果(状态='parsererror') { 警报(“有一个解析器错误。幸运的是,我们知道如何修复它。\n\n”+ “完整的服务器响应文本为”+xhr.responseText); xmlDoc=null; //从responseText字符串创建xml文档。 //这就使用了这个方法。 // if(window.DOMParser) { parser=新的DOMParser(); xmlDoc=parser.parseFromString(xhr.responseText,“text/xml”); } else//internetexplorer { xmlDoc=新的ActiveXObject(“Microsoft.XMLDOM”); xmlDoc.async=“false”; loadXML(xhr.responseText); } $(“#响应”).append(“完成事件/xmlDoc:”+xmlDoc+””); $(“#响应”)。追加(“完成事件/状态:“+status+””); processXMLDoc(xmlDoc); } }, 这里有一个更完整的例子 用jQuery读取XML #回应 { 边框:实心1px黑色; 填充物:5px; } 函数processXMLDoc(xmlDoc) { var heading=$(xmlDoc.find('heading').text(); $(“#响应”)。追加(“”+标题+“”); var bodyText=$(xmlDoc.find('body').text(); $(“#响应”).append(“”+bodyText+””); } $(文档).ready(函数() { jQuery.ajax({ 键入:“获取”, url:“a.xml”//!请注意相同的 // 数据类型:“xml”/“xml”通过浏览器的xml解析器传递它 成功:函数(xmlDoc,状态) { //成功事件意味着xml文档 //已从服务器下载并成功解析 //使用兄弟 complete: function( xhr, status ) { alert( "COMPLETE. You got:\n\n" + xhr.responseText ) ; if( status == 'parsererror' ) { alert( "There was a PARSERERROR. Luckily, we know how to fix that.\n\n" + "The complete server response text was " + xhr.responseText ) ; xmlDoc = null; // Create the xml document from the responseText string. // This uses the w3schools method. // see also if( window.DOMParser ) { parser=new DOMParser(); xmlDoc=parser.parseFromString( xhr.responseText,"text/xml" ) ; } else // Internet Explorer { xmlDoc=new ActiveXObject( "Microsoft.XMLDOM" ) ; xmlDoc.async = "false" ; xmlDoc.loadXML( xhr.responseText ) ; } $( '#response' ).append( '<p>complete event/xmlDoc: ' + xmlDoc + '</p>' ) ; $( '#response' ).append( '<p>complete event/status: ' + status + '</p>' ) ; processXMLDoc( xmlDoc ) ; } }, <!DOCTYPE html> <html> <head> <title>Reading XML with jQuery</title> <style> #response { border: solid 1px black; padding: 5px; } </style> <script src="jquery-1.3.2.min.js"></script> <script> function processXMLDoc( xmlDoc ) { var heading = $(xmlDoc).find('heading').text() ; $( '#response' ).append( '<h1>' + heading + '</h1>' ) ; var bodyText = $(xmlDoc).find('body').text() ; $( '#response' ).append( '<p>' + bodyText + '</p>' ) ; } $(document).ready(function() { jQuery.ajax({ type: "GET", url: "a.xml", // ! watch out for same // origin type problems dataType: "xml", // 'xml' passes it through the browser's xml parser success: function( xmlDoc, status ) { // The SUCCESS EVENT means that the xml document // came down from the server AND got parsed successfully // using the browser's own xml parsing caps. processXMLDoc( xmlDoc ); // IE gets very upset when // the mime-type of the document that // gets passed down isn't text/xml. // If you are missing the text/xml header // apparently the xml parse fails, // and in IE you don't get to execute this function AT ALL. }, complete: function( xhr, status ) { alert( "COMPLETE. You got:\n\n" + xhr.responseText ) ; if( status == 'parsererror' ) { alert( "There was a PARSERERROR. Luckily, we know how to fix that.\n\n" + "The complete server response text was " + xhr.responseText ) ; xmlDoc = null; // Create the xml document from the responseText string. // This uses the w3schools method. // see also if( window.DOMParser ) { parser=new DOMParser(); xmlDoc=parser.parseFromString( xhr.responseText,"text/xml" ) ; } else // Internet Explorer { xmlDoc=new ActiveXObject( "Microsoft.XMLDOM" ) ; xmlDoc.async = "false" ; xmlDoc.loadXML( xhr.responseText ) ; } $( '#response' ).append( '<p>complete event/xmlDoc: ' + xmlDoc + '</p>' ) ; $( '#response' ).append( '<p>complete event/status: ' + status + '</p>' ) ; processXMLDoc( xmlDoc ) ; } }, error: function( xhr, status, error ) { alert( 'ERROR: ' + status ) ; alert( xhr.responseText ) ; } }); }); </script> </head> <body> <div> <h1><a href="http://think2loud.com/reading-xml-with-jquery/">Reading XML with jQuery</a></h1> <p> <a href="http://docs.jquery.com/Ajax/jQuery.ajax#options">#1 jQuery.ajax ref</a> </p> </div> <p>Server says:</p> <pre id="response"> </pre> </body> </html> <?xml version="1.0"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
$(document).ready(function()
{
$.ajax(
{
type: "GET",
url: "messages.xml",
dataType: "XML", /* this parameter MUST BE UPPER CASE for it to work in IE */
success: function(xml)
{
processXmlDoc( createXmlDOMObject ( xml ) );
}, /* success: */
error: function(xhr, textStatus, errorThrown)
{
alert(textStatus + ' ' + errorThrown);
} /* error: */
});/* $.ajax */
function createXmlDOMObject(xmlString)
{
var xmlDoc = null;
if( ! window.DOMParser )
{
// the xml string cannot be directly manipulated by browsers
// such as Internet Explorer because they rely on an external
// DOM parsing framework...
// create and load an XML document object through the DOM
// ActiveXObject that it can deal with
xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
xmlDoc.async = false;
xmlDoc.loadXML( xmlString );
}
else
{
// the current browser is capable of creating its own DOM parser
parser = new DOMParser();
xmlDoc = parser.parseFromString( xmlString, "text/xml" ) ;
}
return xmlDoc;
}
function processXmlDoc(xmlDoc)
{
// write here your XML processing logic for the document object...
}
}); // $(document).ready
$.ajax({
url: "data.xml",
dataType: ($.browser.msie) ? "text" : "xml",
success: function(data){
var xml;
if (typeof data == "string") {
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.loadXML(data);
} else {
xml = data;
}
// write here your XML processing logic for the document object...
}
});
dataType :"text/xml",
dataType :"xml",
$("<div>" + xml + "</div>").find("something");
$.ajax({
url: 'messages.xml',
success: function(data){
$(d).find('message').each(function(){
//But it never gets to here in IE
var $msg = $(this);
var type = $msg.attr("type");
var message = $msg.text();
switch (type) {
case "HeaderMessage":
$("#HeaderMessageDiv").html(message);
break;
case "FooterMessage":
$("#footermessagecell").html(message);
break;
}
});
},
dataType: 'xml'
});
<a>
<messages>
<message type="HeaderMessage">
This message is put up in the header area.
</message>
<message type="FooterMessage">
This message is put in the lower left cell.
</message>
</messages>
</a>
if (window.DOMParser)
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(text,"text/xml");
}
else // Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(text);
}
jQuery.ajax({
type: "GET",
url: "textxml.php",
success: function(msg){
data = parseXml(msg);
//alert(data);
var final_price = jQuery(data).find("price1").text();
alert(final_price);
}
});
function parseXml(xml) {
if (jQuery.browser.msie) {
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.loadXML(xml);
xml = xmlDoc;
}
return xml;
}
xml.children[0].childNodes[1].innerHTML;
xml.childNodes[0].childNodes[1].textContent;
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;
}
<?php
header("Content-type: text/xml");
echo '<myxml></myxml>';
?>