代码之家  ›  专栏  ›  技术社区  ›  Steve Hiner

jQuery.find()在IE中不返回数据,但在Firefox和Chrome中返回数据

  •  23
  • Steve Hiner  · 技术社区  · 17 年前

    我帮一个朋友做了一些网络工作。他需要的一部分是一种简单的方法来更改他网站上的几段文字。我没有让他编辑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>
    

    <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>
    

    编辑:我发现,如果我在Visual Studio 2008中加载页面并运行它,那么它将在IE中工作。所以事实证明,它在通过开发web服务器运行时总是有效的。现在我想IE就是不喜欢这样做。从我的本地驱动器加载的XML中查找,所以也许当它在实际的web服务器上时,它会正常工作。

    15 回复  |  直到 17 年前
        1
  •  12
  •   Matthew Crumley    17 年前

    Ajax完成

        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的内容

    <?xml version="1.0"?>
    <note>
      <to>Tove</to>
      <from>Jani</from>
      <heading>Reminder</heading>
      <body>Don't forget me this weekend!</body>
    </note>
    

    this example .

        2
  •  19
  •   Community Mohan Dere    9 年前

    检查响应的内容类型。如果messages.xml的mime类型错误,Internet Explorer将不会将其解析为xml。

    $(document).ajaxComplete(function(e, x) {
        alert(x.getResponseHeader("Content-Type"));
    });
    

    overrideMimeType 之前可以调用的方法 send

        3
  •  6
  •   McMadsen    16 年前

    Quick&;肮脏的修复方法是将xml响应包装在html元素中,如div:

    $("<div>" + xml + "</div>").find("something");
    

    (适用于所有浏览器)

        4
  •  5
  •   MJJames    17 年前

    您可能会发现,如果将数据类型传递给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>
    

    编辑:

    $(d).filter('message').each(......);
    
        5
  •  3
  •   sanjeev    15 年前

    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;
    }
    
        6
  •  3
  •   Jason Higgins    13 年前

    你可以

    <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>
    

    并使用find()。它适用于IE8和firefox v.3.6.3

        7
  •  1
  •   jacobangel    17 年前

        8
  •  1
  •   Bigabdoul    16 年前

    1. 对于$.ajax(…,dataType:“XML”)和 $.get(xmlDataFilePath,函数(d){…},“xml”)

    2. 当ajax调用成功时, 字符串

    第二个问题是这样解决的:

    $(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
    
        9
  •  1
  •   RobertPitt    16 年前
    $.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'
    });
    

        10
  •  1
  •   Alfred redcoder    14 年前

    dataType :"text/xml",
    

    dataType :"xml",
    

    无需更改find()。

        11
  •  1
  •   Alfred redcoder    14 年前

    .find()

    所以,我分配 "text/xml" response.contentType .

    也就是 response.contentType = "text/xml" 它奏效了。

    "text/html"

        12
  •  0
  •   prof. Xavier    16 年前

    我也遇到了同样的问题,我正在开发一个基于web的应用程序,但我需要它在CD中离线部署。我在这个页面上找到了解决方案,这与你上面看到的解决方案相同 http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests 代码非常简单:

     $.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... 
       }
     });
    
        13
  •  0
  •   stevensf    16 年前

    我也有同样的问题。..

    已解决此问题:

    http://www.w3schools.com/dom/dom_parser.asp

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

    使用它将var转换为xml对象。..

        14
  •  0
  •   TessellatingHeckler    11 年前

    Chrome/Firefox:

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

    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; 
    
    }
    
        15
  •  0
  •   christophe    10 年前

    <?php
        header("Content-type: text/xml");
        echo '<myxml></myxml>';
    ?>