it-swarm.dev

jQuery .find () nevrátí data do IE ale ve Firefoxu a Chrome

Pomohl jsem kamarádovi tím, že jsem pro něj udělal malou webovou práci. Část toho, co potřeboval, byl snadný způsob, jak změnit pár kousků textu na jeho webu. Namísto úpravy HTML jsem se rozhodl poskytnout soubor XML se zprávami v něm a použil jsem jQuery, abych je vytáhl ze souboru a vložil je na stránku.

Funguje to skvěle ... Ve Firefoxu a Chrome, ne tak velký v IE7. Doufal jsem, že mi jeden z vás řekne proč. Udělal jsem spravedlivý, ale googling, ale nemohl jsem najít to, co hledám.

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

A tady je můj hovor 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>

Je něco, co potřebuji udělat jinak v IE? Na základě zprávy s [objekt objektu] jsem předpokládal, že .find pracoval v IE, ale protože nemohu indexovat do pole pomocí [0] nebo zkontrolovat, zda je délka, myslím, že znamená .find nevrací žádné výsledky. Nějaký důvod, proč by to fungovalo perfektně ve Firefoxu a Chrome, ale neuspělo v IE?

Jsem totální nováček s jQuery, takže doufám, že jsem neudělal něco hloupého. Tento kód byl vyřazen z fóra a upraven tak, aby vyhovoval mým potřebám. Vzhledem k tomu, že jQuery je multiplatformní, zjistil jsem, že se s tímto nepořádkem nebudu muset vypořádat.

Edit: Zjistil jsem, že pokud nahraju stránku v Visual Studio 2008 a spustím ji, bude fungovat v IE. Ukazuje se, že vždy funguje při běhu přes vývojový webový server. Teď jsem přemýšlel IE prostě nemá rád dělá .find v XML načten z mého místního disku, takže možná, když je to na skutečný webový server bude fungovat OK.

Potvrdil jsem, že to funguje dobře při procházení z webového serveru. Musí to být zvláštnost s IE. Hádám, že je to proto, že webový server nastavuje typ mime pro přenos dat XML a bez toho, aby IE nespravoval správně XML.

24
Steve Hiner

Zkontrolujte typ obsahu odpovědi. Pokud se vám dostanou zprávy message.xml jako nesprávný typ mime, aplikace Internet Explorer jej nebude analyzovat jako XML.

Chcete-li zkontrolovat typ obsahu, potřebujete přístup k objektu XMLHttpRequest. Normální úspěšné zpětné volání to nepředává jako parametr, takže musíte přidat obecný obslužný program ajaxComplete nebo ajaxSuccess. Druhým parametrem pro tyto události je objekt XMLHttpRequest. Můžete na něj zavolat metodu getResponseHeader, abyste získali typ obsahu.

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

Bohužel neexistuje žádný způsob, jak v aplikaci Internet Explorer vím, že přepíše, co server odesílá, takže pokud je to špatné, je třeba změnit server tak, aby odeslal text/xml pro typ obsahu.

Některé prohlížeče mají metodu overrideMimeType, kterou můžete zavolat před send, aby ji donutila používat "text/xml", ale Internet Explorer tuto podporu nepodporuje, pokud vím.

12
Matthew Crumley

Since IE's problem is its xml parser chokes on xml files that are not passed down using the correct "text/xml" header, you can include a bit of code in the Ajax complete event:

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

here's a more complete example

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

contents of a.xml

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

It extends this example.

19
bobobobo

DataType: "xml" tento problém v IE8 tento problém neřeší, ale spíše prostřednictvím očekávání typu "TypeError".

Rychlá a špinavá oprava je zabalit xml odpověď do elementu html, jako div:

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

(funguje ve všech prohlížečích)

6
McMadsen

Možná zjistíte, že pokud předáte datový typ do svého volání, může se správně analyzovat jako XML. IE je quirks by mohlo zastavit jQuery autodetecting to jako XML, což má za následek nesprávný typ dat je předán zpětné volání funkce.

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

UPRAVIT:

Vlastně jsem právě zažil .find () nepracoval pro projekt v žádném prohlížeči, ale místo toho jsem mohl použít .filter (). Je to nepříjemné, že jsem se musela uchýlit k tomuto, ale pokud to funguje.

$(d).filter('message').each(......);
5
MJJames

Měl jsem také stejný problém, ale měl jsem opraven problém IE jQuery XML .find () pomocí níže uvedeného kódu.

Poznámka: Místo .html () použijte .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;
}
3
sanjeev

Můžete dělat 

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

a použijte find (). Funguje pro IE8 a pro firefox v.3.6.3

3
Guest

Při načítání dat z dokumentu XML jsem narazil na stejný problém. Poté, co jsem na internetu hodně koukal na internetu, jsem přišel na to, abych našel tuto webovou stránku, ale na tuto otázku neodpovídal. Ale jedna odpověď mi pomohla vyřešit problém:

"Vzhledem k tomu, že problémem IE je jeho xml parsery na xml souborech, které nejsou předávány pomocí správného záhlaví" text/xml ", můžete do události Ajax doplnit trochu kódu:"

Identifikoval jsem dva problémy s IE při volání $ .ajax (...) a $ .get (...):

  1. Hodnota parametru xml musí být ve velkých písmenech ('XML' ne 'xml') pro obě volání - $ .ajax (..., dataType: "XML") a $ .get ( xmlDataFilePath, funkce (d) {...}, "xml")

  2. Když volání ajax uspěje, argument xml funkce zpětného volání je vlastně řetězec není objekt XML DOM

Druhý problém je vyřešen takto:

$(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
1
Bigabdoul

Také jsem měl stejný problém při importu e-mailových kontaktů. Byl jsem schopen importovat kontakty a zobrazovat se ve všech prohlížečích s výjimkou IE, protože .find() nefungovalo.

Takže jsem přidělil "text/xml" do response.contentType

tj. response.contentType = "text/xml" a fungovalo to.

dříve to bylo "text/html"

1
Wasim
$.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'
});

Zkuste říct jQuery jaké dataType jeho získání tak, že používá správné metody pro zpracování vašeho požadavku.

1
RobertPitt

Někdy IE čte konce řádků jako další uzly. Zkuste odebrat extra bílé místo až ke značkám, nebo zkuste jej zapouzdřit jako CDATA. 

1
jacobangel

Změňte následující obsah.

dataType :"text/xml",

na

dataType :"xml",

Není třeba měnit hledání ().

1
Rahul Vaidya

Pokud je XML generováno skriptem PHP, můžete to udělat

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

Pak metoda hledání funguje na každém prohlížeči

0
christophe

Mám stejný problém...

Vyřešeno s tímto:

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

použijte jej k transformaci vašeho var na xml objekt ...

0
stevensf

Funguje to dobře !!! Zkuste to,

Chrome/Firefox:

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

IE8 +/Safari:

xml.childNodes[0].childNodes[1].textContent;

IE8:

xml.documentElement.childNodes[1].text;

Ukázkový kód zde,

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; 

}
0
Muthu Selvam

Měl jsem stejný problém, vyvíjím aplikaci, která je webová, ale potřebuji ji nasadit do režimu offline, uvnitř CD. Na této stránce jsem našel řešení, které je stejné jako řešení výše http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests A kód je velmi jednoduchý:

 $.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... 
   }
 });
0
prof. Xavier