jQuery .find () не возвращает данные в IE, но делает в Firefox и Chrome

Вот что я сделал:

Я расколол ваш файл данных в более длинный формат, а затем сгруппировал его по столбцу имен. В каждой группе я бросаю NaNs, но затем пересказываю полный набор h1 мысли h4, тем самым воссоздавая ваши NaN справа.

from io import StringIO
import pandas

def defragment(x):
    values = x.dropna().values
    return pandas.Series(values, index=df.columns[:len(values)])

datastring = StringIO("""\
Name    h1    h2    h3    h4
A       1     nan   2     3
B       nan   nan   1     3
C       1     3     2     nan""")

df = pandas.read_table(datastring, sep='\s+').set_index('Name')
long_index = pandas.MultiIndex.from_product([df.index, df.columns])

print(
    df.stack()
      .groupby(level='Name')
      .apply(defragment)
      .reindex(long_index)  
      .unstack()  
)

И вот я получаю:

   h1  h2  h3  h4
A   1   2   3 NaN
B   1   3 NaN NaN
C   1   3   2 NaN
23
задан Steve Hiner 20 February 2009 в 20:19
поделиться

11 ответов

Проверьте тип контента ответа. Если Вы получите messages.xml как неправильный тип пантомимы, то Internet Explorer не проанализирует его как XML.

Для проверки типа контента Вам нужен доступ к объекту XMLHttpRequest. Нормальный обратный вызов успеха не передает его в качестве параметра, таким образом, необходимо добавить универсальный ajaxComplete или ajaxSuccess обработчик событий. Второй параметр для тех событий является объектом XMLHttpRequest. Можно назвать getResponseHeader метод на нем для получения типа контента.

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

, К сожалению, нет никакого способа, которым я знаю о в Internet Explorer для переопределения то, что сервер отправляет, поэтому если неправильно, что необходимо изменить сервер для отправки "text/xml" за типом контента.

Некоторые браузеры имеют overrideMimeType метод, который можно назвать прежде send, чтобы вынудить это использовать "text/xml", но Internet Explorer не поддерживает это насколько я знаю.

12
ответ дан Matthew Crumley 29 November 2019 в 01:27
поделиться

Иногда IE читает разрывы строки как дополнительные узлы. Попытайтесь удалить дополнительный пробел до тегов или попытайтесь монтировать в корпус его как CDATA.

1
ответ дан jacobangel 29 November 2019 в 01:27
поделиться

Можно найти, что при передаче типа данных в Ваш получать вызов он может проанализировать как 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>

РЕДАКТИРОВАНИЕ:

я на самом деле только что испытал .find () не работающий на проект ни в каком браузере, но я смог использовать .filter () вместо этого. Это является раздражающим, что я должен был обратиться к этому, но если это работает....

$(d).filter('message').each(......);
5
ответ дан MJJames 29 November 2019 в 01:27
поделиться

Так как проблема IE заключается в том, что его xml парсер давит на xml файлы, которые не передаются с использованием правильного заголовка "text/xml", вы можете включить немного кода в событие Ajax complete:

    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>

содержимого 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>

Оно расширяет этот пример.

19
ответ дан 29 November 2019 в 01:27
поделиться

Я столкнулся с той же проблемой, когда я получал данные из документа XML. Ведь протягивающуюся в Интернете, я подошел найти этот сайт, но без подходящего ответа на вопрос. Но один ответ помог мне решить проблему, хотя:

«Поскольку проблема IE IE - это его разбивки анализатора XML на XML-файлах, которые не передаются вниз, используя правильный заголовок« Text / XML », вы можете включить немного кода в AJAX Полное событие: «

Я определил две проблемы с IE при создании вызовов $ .ajax (...) и $. (...):

  1. значение XML значение параметра должно Будьте в верхнем регистре («XML» не «XML») для обоих вызовов - $ .ajax (..., datatype: "XML") и $. Get (XmldatafilePath, функция (d) {...} , «XML»)

  2. Когда ajax вызов добивается успеха, аргумент XML функции обратного вызова на самом деле является строкой , а не объект XML DOM

, второй вопрос решается следующим образом:

$(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
ответ дан 29 November 2019 в 01:27
поделиться

У меня такая же проблема, я разрабатываю веб-приложение, но мне нужно развернуть его в автономном режиме, на 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... 
   }
 });
0
ответ дан 29 November 2019 в 01:27
поделиться

Измените следующее содержимое.

dataType :"text/xml",

-

dataType :"xml",

Нет необходимости изменять find ().

1
ответ дан 29 November 2019 в 01:27
поделиться
$.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, какой тип данных он получает, чтобы он использовал правильные методы для обработки вашего запроса.

1
ответ дан 29 November 2019 в 01:27
поделиться

DataType : "xml" не устраняет эту проблему в IE8, а скорее вызывает ошибку "TypeError".

Быстрое и грязное решение, это обернуть xml ответ в html элемент, например div:

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

(работает во всех браузерах)

6
ответ дан 29 November 2019 в 01:27
поделиться

Вы можете сделать

<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

3
ответ дан 29 November 2019 в 01:27
поделиться

У меня та же проблема...

Решил с помощью этого :

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 объект...

0
ответ дан 29 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: