Javascript find()不';在IE中不返回数据,但在Firefox和Chrome中返回数据

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>

我帮一个朋友做了一点网络工作。他需要的一部分是一个简单的方法来改变他的网站上的几段文字。我没有让他编辑HTML,而是决定提供一个包含消息的XML文件,并使用jQuery将它们从文件中取出并插入页面

它工作得很好。。。在Firefox和Chrome中,在IE7中没有那么好。我希望你们中的一个能告诉我为什么。我在谷歌上搜索了一段时间,但没有找到我要找的东西

以下是XML:

<?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>';
?>