Подтвердить что ты не робот

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

Я помог другу, сделав для него небольшую работу в Интернете. Часть того, что ему нужно, это простой способ изменить пару фрагментов текста на своем сайте. Вместо того, чтобы его редактировать 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>

И вот мой вызов 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? На основе окна сообщения с [объектом Object] я предполагаю, что .find работал в IE, но поскольку я не могу индексировать в массив с помощью [0] или проверять длину, я предполагаю, что это означает .find is not возвращая любые результаты. Любая причина, почему это отлично работает в Firefox и Chrome, но не работает в IE?

Я полный новичок с jQuery, поэтому надеюсь, что я просто не сделал что-то глупое. Этот код выше был очищен от форума и изменен в соответствии с моими потребностями. Поскольку jQuery является кросс-платформенным, я решил, что мне не придется иметь дело с этим беспорядком.

Изменить: я обнаружил, что если я загружу страницу в Visual Studio 2008 и запустил ее, она будет работать в IE. Таким образом, оказывается, что он всегда работает при запуске веб-сервера разработки. Теперь я думаю, что IE просто не нравится делать .find в XML, загруженном с моего локального диска, поэтому, возможно, когда это будет на реальном веб-сервере, он будет работать нормально.

Я подтвердил, что он отлично работает при просмотре с веб-сервера. Должна быть особенность IE. Я предполагаю это, потому что веб-сервер устанавливает тип mime для передачи файла данных xml и без этого IE не анализирует xml правильно.

4b9b3361

Ответ 1

Проверьте тип содержимого ответа. Если вы получаете message.xml как неправильный тип mime, 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 не поддерживает это, насколько мне известно.

Ответ 2

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

<Предварительно >   complete: function (xhr, status)   {     alert ( "COMPLETE. Вы получили:\n\n" + xhr.responseText);     if (status == 'parsererror')     {       alert ( "Был PARSERERROR. К счастью, мы знаем, как это исправить. \n\n" +               "Полный текст ответа сервера был" + xhr.responseText ";       xmlDoc = null;       // Создаем XML-документ из строки responseText.       // Используется метод w3schools.       // см. также      if (window.DOMParser)       {         parser = new DOMParser();         xmlDoc = parser.parseFromString(xhr.responseText, "text/xml" );       }       else//Internet Explorer       {         xmlDoc = новый объект ActiveXObject ( "Microsoft.XMLDOM" );         xmlDoc.async = "false";         xmlDoc.loadXML(xhr.responseText);       }       $ ('#response').append('<p> complete event/xmlDoc:' + xmlDoc + '</p> ');       $ ('#response').append('<p> полное событие/статус:' + статус + '</p> ');       processXMLDoc (xmlDoc);     }   },

здесь более полный пример

<Предварительно > <! DOCTYPE html > < & HTML GT; < & головка GT; <title> Чтение XML с помощью jQuery </title> < & стиль GT; #ответ { граница: сплошной 1px черный; padding: 5px; } </тип > < 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> '); } $ (Документ).ready(функция() { jQuery.ajax({   тип: "GET",   url: "a.xml", //! следите за тем же   // проблемы типа происхождения   dataType: "xml", // 'xml' передает его через синтаксический анализатор браузера xml   success: function (xmlDoc, status)   {     //SUCCESS EVENT означает, что XML-документ     // спустился с сервера И успешно прошел синтаксический анализ     // используя собственные шаблоны синтаксического анализа xml.     processXMLDoc (xmlDoc);     //IE очень расстраивается, когда     //mime -тип документа, который     // передается вниз, это не text/xml.     // Если вам не хватает заголовка text/xml     // По-видимому, синтаксический анализ xml терпит неудачу,     // и в IE вы не можете выполнять эту функцию ВСЕ.   },   complete: function (xhr, status)   {     alert ( "COMPLETE. Вы получили:\n\n" + xhr.responseText);     if (status == 'parsererror')     {       alert ( "Был PARSERERROR. К счастью, мы знаем, как это исправить. \n\n" +               "Полный текст ответа сервера был" + xhr.responseText ";       xmlDoc = null;       // Создаем XML-документ из строки responseText.       // Используется метод w3schools.       // см. также      if (window.DOMParser)       {         parser = new DOMParser();         xmlDoc = parser.parseFromString(xhr.responseText, "text/xml" );       }       else//Internet Explorer       {         xmlDoc = новый объект ActiveXObject ( "Microsoft.XMLDOM" );         xmlDoc.async = "false";         xmlDoc.loadXML(xhr.responseText);       }       $ ('#response').append('<p> complete event/xmlDoc:' + xmlDoc + '</p> ');       $ ('#response').append('<p> полное событие/статус:' + статус + '</p> ');       processXMLDoc (xmlDoc);     }   },   error: function (xhr, status, error)   {     alert ('ОШИБКА: + статус);     alert (xhr.responseText);   } }); }); </script> </головка > & Л; тело > < & DIV GT;   <h1 > < a href= "http://think2loud.com/reading-xml-with-jquery/" > Чтение XML с помощью jQuery </a> </h1 >   < р >     < a href= "http://docs.jquery.com/Ajax/jQuery.ajax#options" > # 1 jQuery.ajax ref </a>   </р > </дел > Сервер говорит: </p> < pre id = "response" > </предварительно > </тело > </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>

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

Ответ 3

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

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

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

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

Ответ 4

Вы можете обнаружить, что если вы передадите тип данных в ваш вызов get, он может корректно проанализировать XML. IE quirks может остановить 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>

EDIT:

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

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

Ответ 5

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

<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

Ответ 6

У меня также была такая же проблема, но я исправил проблему 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;
}

Ответ 7

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

Ответ 8

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

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

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

  • Значение параметра xml должно быть в верхнем регистре ( "XML" не "xml" ) для обоих вызовов - $.ajax(..., dataType: "XML" ) и $.get(xmlDataFilePath, function (d) {...}, "xml" )

  • Когда вызов 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

Ответ 9

Измените следующий контент.

dataType :"text/xml",

к

dataType :"xml",

Не нужно менять find().

Ответ 10

$.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 получает, чтобы он использовал правильные методы для обработки вашего запроса.

Ответ 11

У меня также была такая же проблема при импорте контактов электронной почты. Я смог импортировать контакты и отображать во всех браузерах, кроме IE, поскольку .find() не работал.

Итак, я назначил "text/xml" на response.contentType.

то есть. response.contentType = "text/xml" и он работал.

раньше это было "text/html"

Ответ 12

У меня была та же проблема, я разрабатываю приложение, основанное на сети, но мне нужно его для развертывания в автономном режиме на компакт-диске. Я нашел решение на этой странице, которое является тем же самым решением, которое вы можете выполнить выше 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

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

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

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

Он работает отлично!!! Попробуйте это,

Chrome/Firefox:

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; 

}

Ответ 15

Если XML генерируется PHP script, вы можете сделать

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

Затем метод find работает в каждом браузере