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 правильно.
Ответы
Ответ 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 работает в каждом браузере