jQuery .find () não retorna dados no IE, mas no Firefox e no Chrome

Eu ajudei um amigo fazendo um pequeno trabalho na web para ele. Parte do que ele precisava era uma maneira fácil de alterar alguns textos em seu site. Em vez de editá-lo, decidi fornecer um arquivo XML com as mensagens nele e usei o jQuery para retirá-los do arquivo e inseri-los na página.

Ele funciona muito bem … No Firefox e no Chrome, não é tão bom no IE7. Eu estava esperando que um de vocês pudesse me dizer por quê. Eu fiz uma feira, mas de googling mas não consegui encontrar o que estou procurando.

Aqui está o XML:

   This message is put up in the header area.   This message is put in the lower left cell.   

E aqui está minha chamada jQuery:

  $(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: } }); }); });  

Existe algo que eu preciso fazer de diferente no IE? Baseado na checkbox de mensagem com [object Object], eu presumo que o .find estava funcionando no IE, mas como eu não posso indexar no array com [0] ou checar se está Comprimento, eu estou supondo que significa .find não é retornando quaisquer resultados. Qualquer razão pela qual isso funcionaria perfeitamente no Firefox e no Chrome, mas falharia no IE?

Eu sou um novato total com jQuery, então espero não ter feito algo estúpido. Esse código acima foi retirado de um fórum e modificado para atender às minhas necessidades. Como o jQuery é multi-plataforma, imaginei que não teria que lidar com essa bagunça.

Edit: Eu encontrei que se eu carregar a página no Visual Studio 2008 e executá-lo, então ele vai funcionar no IE. Então, acontece que sempre funciona quando executado através do servidor web de desenvolvimento. Agora eu estou pensando IE apenas não gosta de fazer .encontrar em XML carregado fora da minha unidade local, então talvez quando isso está em um servidor web real, vai funcionar bem.

Confirmei que funciona bem quando navegado de um servidor da web. Deve ser uma peculiaridade com o IE. Eu estou supondo que é porque o servidor web define o tipo mime para a transferência de arquivos de dados xml e sem que o IE não analise o xml corretamente.

Verifique o tipo de conteúdo da resposta. Se você receber messages.xml como o tipo mime errado, o Internet Explorer não analisará isso como XML.

Para verificar o tipo de conteúdo, você precisa acessar o object XMLHttpRequest. O retorno de chamada normal de sucesso não o passa como um parâmetro, portanto, você precisa adicionar um manipulador de events genérico ajaxComplete ou ajaxSuccess. O segundo parâmetro para esses events é o object XMLHttpRequest. Você pode chamar o método getResponseHeader para obter o tipo de conteúdo.

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

Infelizmente não há nenhuma maneira que eu saiba no Internet Explorer para replace o que o servidor envia, por isso, se estiver errado, você precisa alterar o servidor para enviar “text / xml” para o tipo de conteúdo.

Alguns navegadores têm um método overrideMimeType que você pode chamar antes de send para forçá-lo a usar “text / xml”, mas o Internet Explorer não suporta isso até onde eu sei.

Como o problema do IE é o seu xml parkes chokes em arquivos xml que não são passados ​​usando o header “text / xml” correto, você pode include um pouco de código no evento complete do Ajax :

     complete: function (xhr, status)
     {
       alert ("COMPLETE. Você obteve: \ n \ n" + xhr.responseText);
       if (status == 'parsererror')
       {
         alert ("Houve um PARSERERROR. Felizmente, sabemos como corrigir isso. \ n \ n" +
                "O texto completo da resposta do servidor era" + xhr.responseText);

         xmlDoc = null;

         // Cria o documento xml a partir da string responseText.
         // Isso usa o método w3schools .
         // veja também
         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 ('

evento completo / xmlDoc:' + xmlDoc + ''); $ ('#response') .append ('

evento completo / status:' + status + ''); processXMLDoc (xmlDoc); } }

aqui está um exemplo mais completo

 < ! DOCTYPE html>
 
 
  Lendo XML com jQuery 
 <style>
 #resposta
 {
   borda: sólido 1px preto;
   preenchimento: 5px;
 }
 
 <script src = "jquery-1.3.2.min.js"> 
 </script><script>
 function processXMLDoc (xmlDoc)
 {
   var heading = $ (xmlDoc) .find ('heading'). text ();
   $ ('#response') .append ('<h1>' + header + '');

   var bodyText = $ (xmlDoc) .find ('body'). text ();
   $ ('#response') .append ('<p>' + bodyText + '');
 }
 $ (document) .ready (function ()
 {
   jQuery.ajax ({

     tipo: "GET",

     url: "a.xml", //!  atente para o mesmo
     // problemas no tipo de origem

     dataType: "xml", // 'xml' passa pelo analisador xml do navegador

     success: function (xmlDoc, status)
     {
       // O EVENTO DE SUCESSO significa que o documento xml
       // desceu do servidor e foi analisado com sucesso
       // usando os próprios limites de análise xml do navegador.

       processXMLDoc (xmlDoc);

       // IE fica muito chateado quando
       // o tipo mime do documento que
       // é passado não é text / xml.

       // Se você está perdendo o header text / xml
       // aparentemente a análise xml falha
       // e no IE você não consegue executar essa function.

     }
     complete: function (xhr, status)
     {
       alert ("COMPLETE. Você obteve: \ n \ n" + xhr.responseText);
       if (status == 'parsererror')
       {
         alert ("Houve um PARSERERROR. Felizmente, sabemos como corrigir isso. \ n \ n" +
                "O texto completo da resposta do servidor era" + xhr.responseText);

         xmlDoc = null;

         // Cria o documento xml a partir da string responseText.
         // Isso usa o método w3schools .
         // veja também
         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><p> evento completo / xmlDoc:' + xmlDoc + '');
         $ ('#response') .append ('</p><p> evento completo / status:' + status + '');

         processXMLDoc (xmlDoc);
       }
     }
     erro: function (xhr, status, erro)
     {
       alert ('ERRO:' + status);
       alerta (xhr.responseText);
     }
   });
 });
 
 
 <body>
   <div>
     <h1> <a href="http://think2loud.com/reading-xml-with-jquery/"> Lendo XML com jQuery </a> 
     <p>
       <a href="http://docs.jquery.com/Ajax/jQuery.ajax#options"> # 1 jQuery.ajax ref </a>
     

   

   </p><p> O servidor diz: 
   <pre id = "response">

   
 
 

</pre>
<h2>  conteúdo de a.xml </h2>
<pre>
 < ? xml version = "1.0">
 <note>
   <to> Tove 
   <de> Jani 
   <heading> Lembrete 
   <body> Não me esqueças este fim-de-semana! 
 
</body></heading></de></to></note></pre>
</p>
<p>  Estende este exemplo . </p>
</h1>
</div>
<p></body></p>
</h1>
<p></script></style>
<p>

O dataType: “xml” não corrige esse problema no IE8, mas sim através de uma expection “TypeError”.

Correção rápida e suja, é envolver a resposta xml em um elemento html, como div:

 $("
" + xml + "
").find("something");

(funciona em todos os navegadores)

Você pode descobrir que, se passar o tipo de dados para sua chamada get, ele poderá ser analisado como XML corretamente. As peculiaridades do IE poderiam impedir que o jQuery fosse autodetectado como XML, resultando na transmissão do tipo de dado errado para a function de retorno de chamada.

  

EDITAR:

Eu acabei de experimentar o .find () não funcionando para um projeto em qualquer navegador, mas eu consegui usar .filter (). É chato ter que recorrer a isso, mas se funcionar …

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

Eu também tive o mesmo problema, mas eu tinha corrigido o problema do IE jQuery XML .find () usando o código abaixo.

Nota: Use .text () em vez de .html ().

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

Você pode fazer

    This message is put up in the header area.   This message is put in the lower left cell.    

e use find (). Funciona para o IE8 e para o firefox v.3.6.3

Às vezes, o IE lê as quebras de linha como nós extras. Tente remover o espaço em branco extra até as tags ou tente encapsulá-lo como CDATA.

Eu corri para o mesmo problema quando eu estava recuperando dados de um documento XML. Depois de pesquisar muito na Internet, eu encontrei este site, mas sem resposta adequada para o problema. Mas uma resposta me ajudou a resolver o problema:

“Como o problema do IE é o xml parser chokes em arquivos xml que não são passados ​​usando o header” text / xml “correto, você pode include um pouco de código no evento complete do Ajax:”

Eu identifiquei dois problemas com o IE ao fazer as chamadas $ .ajax (…) e $ .get (…):

  1. O valor do parâmetro xml deve estar em letras maiúsculas (‘XML’ não ‘xml’) para as duas chamadas – $ .ajax (…, dataType: “XML”) e $ .get (xmlDataFilePath, function (d) {.. ., “xml”)

  2. Quando a chamada ajax é bem-sucedida, o argumento xml da function de retorno de chamada é, na verdade, uma string não um object DOM XML

A segunda questão é resolvida desta maneira:

 $(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: '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' }); 

Tente dizer ao jQuery que dataType está sendo usado para que ele use os methods corretos para processar sua solicitação.

Altere o conteúdo a seguir.

 dataType :"text/xml", 

para

 dataType :"xml", 

Não há necessidade de alterar o find ().

Eu também tive o mesmo problema ao importar contatos de email. Eu era capaz de importar contatos e exibir em todos os navegadores, exceto no IE, como .find() não estava funcionando.

Então, eu designei "text/xml" para response.contentType .

ou seja, response.contentType = "text/xml" e funcionou.

anteriormente era "text/html"

Eu tive o mesmo problema, estou desenvolvendo um aplicativo que é baseado na web, mas preciso implantá-lo offline, dentro de um CD. Eu encontrei solução nesta página que é a mesma solução que você pode ver acima http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests e o código é muito simples:

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

Eu tenho o mesmo problema…

Resolvido com isso:

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

use-o para transformar seu var em object xml …

Está funcionando bem !!! Tente isso

Chrome / Firefox:

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

IE8 + / Safari:

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

IE8:

 xml.documentElement.childNodes[1].text; 

Exemplo de código aqui

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

Se o XML é gerado por um script PHP, você pode fazer

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

Então o método find funciona em todos os navegadores