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

我帮他的朋友做了一些networking工作。 部分他需要的是一个简单的方法来改变他的网站上的几段文字。 而不是让他编辑HTML我决定提供一个XML文件的消息,我用jQuery把他们拉出文件,并将其插入到页面中。

它工作得很好…在Firefox和Chrome中,在IE7中并不是那么棒。 我希望你们中的一个能告诉我为什么。 我做了一个公平的,但使用谷歌search,但无法find我在找什么。

这里是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> 

有什么我需要做不同的IE? 基于消息框与[对象对象]我假定.find工作在IE中,但因为我不能索引到数组[0]或检查它的长度我猜这意味着.find不是返回任何结果。 任何理由为什么这将在Firefox和Chrome完美的工作,但在IE浏览器失败?

我是一个jQuery总新手,所以我希望我不只是做了一些愚蠢的事情。 上面的代码被从论坛中删除,并修改,以适应我的需求。 由于jQuery是跨平台的,我想我不必处理这个混乱。

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

我已经确认,从Web服务器浏览时,它工作正常。 必须是一个与IE的特性。 我猜这是因为Web服务器设置MIMEtypes的XML数据文件传输,没有这个IE不能正确parsingXML。

检查响应的内容types。 如果您将messages.xml作为错误的MIMEtypes,则Internet Explorer将不会将其parsing为XML。

要检查内容types,您需要访问XMLHttpRequest对象。 正常的成功callback不会将其作为parameter passing,因此您需要添加通用的ajaxComplete或ajaxSuccess事件处理程序。 这些事件的第二个参数是XMLHttpRequest对象。 你可以调用getResponseHeader方法来获取内容types。

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

不幸的是,我不知道在Internet Explorer中重写什么服务器发送,所以如果它是错误的,你需要改变服务器发送“文本/ XML”的内容types。

一些浏览器有一个overrideMimeType方法,您可以在send之前调用它来强制使用“text / xml”,但据我所知,Internet Explorer不支持这种方法。

由于IE的问题是xmlparsing器在xml文件上窒息,这些xml文件没有使用正确的“text / xml”头传递,所以可以在Ajax complete事件中包含一些代码:

    完成:function(xhr,status)
     {
       alert(“COMPLETE。You got:\ n \ n”+ xhr.responseText);
       if(status =='parsererror')
       {
        警报(“有一个PARSERERROR。幸运的是,我们知道如何解决这个问题。\ n \ n”+
                “完整的服务器响应文本是”+ xhr.responseText“;

         xmlDoc = null;

         //从responseTextstring中创buildxml文档。
         //这使用w3schools方法。
         // 另见
        如果(window.DOMParser)
         {
           parser = new DOMParser();
           xmlDoc = parser.parseFromString(xhr.responseText,“text / xml”);
         }
        其他// 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>
用jQuery读取XML </ title>
 <风格>
 #响应
 {
  边框:实心1px黑色;
  填充:5px;
 }
 </样式>
 <script src =“jquery-1.3.2.min.js”> </ script>
 <SCRIPT>
函数processXMLDoc(xmlDoc)
 {
   var heading = $(xmlDoc).find('heading').text();
   $('#response').append('<h1>'+ heading +'</ h1>');

   var bodyText = $(xmlDoc).find('body')。text();
   $('#response').append('<p>'+ bodyText +'</ p>');
 }
 $(文件)。就绪(函数()
 {
   jQuery.ajax({

    键入:“GET”,

     url:“a.xml”,//! 小心相同
     // 原点types问题

     dataType:“xml”,//“xml”将它传递给浏览器的xmlparsing器

    成功:函数(xmlDoc,状态)
     {
       //成功事件意味着xml文档
       //从服务器下来并成功parsing
       //使用浏览器自己的xmlparsing上限。

       processXMLDoc(xmlDoc);

       / / IE获取非常不高兴的时候
       //文档的MIMEtypes
       //传入的不是text / xml。

       //如果缺lesstext / xml标题
       //显然xmlparsing失败,
       / /在IE中,你不能执行这个function。

     },
    完成:function(xhr,status)
     {
       alert(“COMPLETE。You got:\ n \ n”+ xhr.responseText);
       if(status =='parsererror')
       {
        警报(“有一个PARSERERROR。幸运的是,我们知道如何解决这个问题。\ n \ n”+
                “完整的服务器响应文本是”+ xhr.responseText“;

         xmlDoc = null;

         //从responseTextstring中创buildxml文档。
         //这使用w3schools方法。
         // 另见
        如果(window.DOMParser)
         {
           parser = new DOMParser();
           xmlDoc = parser.parseFromString(xhr.responseText,“text / xml”);
         }
        其他// 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);
       }
     },
    错误:函数(xhr,状态,错误)
     {
      警报('ERROR:'+状态);
       alert(xhr.responseText);
     }
   });
 });
 </ SCRIPT>
 </ HEAD>
 <BODY>
   <DIV>
     <h1> <a href="http://think2loud.com/reading-xml-with-jquery/">用jQuery读取XML </a> </ h1>
     <P>
       <a href="http://docs.jquery.com/Ajax/jQuery.ajax#options">#1 jQuery.ajax参考</a>
     </ p>

   </ DIV>

  服务器说:</ p>
   <pre id =“response”>

   </ PRE>
 </ BODY>
 </ HTML>

a.xml的内容

 <?xml version =“1.0”?>
 <注意>
   <至>托弗</至>
   <从>亚尼</从>
   <标题>提醒</标题>
   <body>这周末别忘了我!</ body>
 </注释>

它扩展了这个例子 。

dataType:“xml”不能解决IE8中的这个问题,而是通过“TypeError”期望。

快速和肮脏的修复,就是将xml响应包装在一个html元素中,比如div:

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

(适用于所有浏览器)

您可能会发现,如果您将数据types传递给get调用,则可能会将其parsing为XML。 IE的怪癖可能会阻止jQuery将其自动检测为XML,导致将错误的数据types传递给callback函数。

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

编辑:

实际上我只是经历过.find()不能在任何浏览器中工作,但是我可以使用.filter()来代替。 这是令人讨厌的,我不得不诉诸这个,但如果它的工作….

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

我也有同样的问题,但我已经解决了IE浏览器的jQuery XML .find()问题使用下面的代码。

注意:使用.text()而不是.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; } 

你可以做

 <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

有时IE读取换行符作为额外的节点。 尝试删除多余的空格,直到标签,或尝试将其封装为CDATA。

当我从XML文档中检索数据时遇到了同样的问题。 在互联网上search了很多东西后,我find了这个网站,但没有正确回答这个问题。 但是有一个答案帮助我解决了这个问题,

“由于IE的问题是xmlparsing器在xml文件上窒息,而这些xml文件并没有通过正确的”text / xml“头传递,所以你可以在Ajax complete事件中包含一些代码:”

我在使用$ .ajax(…)和$ .get(…)调用时发现了两个IE问题:

  1. 这两个调用的xml参数值必须是大写('XML'而不是'xml')。$ .ajax(…,dataType:“XML”)和$ .get(xmlDataFilePath,function(d){.. 。},“xml”)

  2. 当ajax调用成功时, callback函数的xml参数实际上是一个不是XML DOM对象的string

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

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

试着告诉jQuery dataType是什么,以便它使用正确的方法来处理你的请求。

更改以下内容。

 dataType :"text/xml", 

 dataType :"xml", 

不需要改变find()。

导入电子邮件联系人时也遇到同样的问题。 我能够导入联系人并显示在所有的浏览器,除了在IE浏览器,因为.find()不工作。

所以,我把"text/xml"赋给了response.contentType

response.contentType = "text/xml" ,它的工作。

早些时候是"text/html"

我有同样的问题,我正在开发一个基于Web的应用程序,但我需要它在CD内离线部署它。 我发现解决scheme在这个页面是相同的解决scheme,你可以在上面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... } }); 

我有同样的问题…

解决这个问题:

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对象…

它工作正常! 尝试这个,

镀铬/火狐:

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

IE8 + / Safari浏览器:

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

如果XML是由PHP脚本生成的,你可以这样做

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

然后find方法适用于每个浏览器