jQuery .find () не возвращает данные в IE, а в Firefox и Chrome - PullRequest
24 голосов
/ 18 февраля 2009

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

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

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

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

Ответы [ 15 ]

1 голос
/ 18 февраля 2009

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

0 голосов
/ 17 сентября 2015

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

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

Тогда метод find работает в любом браузере

0 голосов
/ 21 февраля 2015

Работает нормально !!! Попробуйте это,

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; 

}
0 голосов
/ 02 августа 2010

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

Решено с этим:

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 голосов
/ 10 февраля 2010

У меня была такая же проблема, я занимаюсь разработкой приложения на основе веб-интерфейса, но оно мне нужно для его автономного развертывания на компакт-диске. На этой странице я нашел решение, которое можно найти выше 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... 
   }
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...