Парсинг возвратил HTML из запроса jQuery AJAX
То, что я пытаюсь сделать, кажется простым: получите HTML-страницу через $.ajax()
и вытащите из нее значение.
$(function () {
$.ajax({
url: "/echo/html",
dataType: "html",
success: function (data) {
$('#data').text(data);
$('#wtf').html($(data).find('#link').text());
},
data: {
html: '<!DOCTYPE html><head><title><\/title><link href="../css/popup.css" rel="stylesheet" /><\/head><body><ul><li><a id="link">content<\/a><\/li><\/ul><\/body><\/html>'
}
});
});
Проблема заключается в том, что jQuery отказывается анализировать возвращенный HTML.
fiddle Я играю с этим, пока что не работает, поэтому я еще могу сделать, чтобы обеспечить рабочий пример.
ОБНОВЛЕНИЕ: Моя новая скрипка работает нормально, но, похоже, проблема в том, что в моем фактическом проекте я пытаюсь разобрать большой, сложный бит HTML. Это известная проблема?
Ответы
Ответ 1
Ваш код работает нормально. Вы просто не используете jsFiddle API правильно. Проверьте документы для /echo/html/
(http://doc.jsfiddle.net/use/echo.html#html):
URL:/echo/html/
Данные должны быть предоставлены через POST
Итак, вам нужно обновить вызов AJAX, чтобы использовать POST. Также необходима конечная косая черта.
$(function () {
$.ajax({
url: "/echo/html/",
type: "post",
dataType: "html",
success: function (data) {
$('#data').text(data);
$('#wtf').html($(data).find('#link').text());
},
data: {
html: '<!DOCTYPE html><head><title><\/title><link href="../css/popup.css" rel="stylesheet" /><\/head><body><ul><li><a id="link">content<\/a><\/li><\/ul><\/body><\/html>'
}
});
});
DEMO: http://jsfiddle.net/hcrM8/6/
Ответ 2
Если вы хотите проанализировать его, jquery имеет отличный трюк:)
ParsedElements = $(htmlToParse);
Console.log(ParsedElements);
Теперь у вас есть элементы DOM
, которые вы можете перемещать, не помещая их в тело документа.
Ответ 3
jQuery.parseHTML()
http://api.jquery.com/jQuery.parseHTML/
str = "hello, <b>my name is</b> jQuery.",
html = $.parseHTML( str ),
nodeNames = [];
// Gather the parsed HTML node names
$.each( html, function( i, el ) {
nodeNames[ i ] = "<li>" + el.nodeName + "</li>";
});
Что-то не так с вашим ajax на скрипке
http://jsfiddle.net/hcrM8/5/
var html= '<!DOCTYPE html><head><title><\/title><link href="../css/popup.css" rel="stylesheet" /><\/head><body><ul><li><a class="disabled" id="link">content<\/a><\/li><\/ul><\/body><\/html>';
h = $.parseHTML(html);
$('#data').text(h);
$('#wtf').html($(h).find('#link').text());
Ответ 4
У меня была такая же проблема, и я исправил инкапсуляцию запрошенного кода html только в один элемент контейнера.
Плохой пример:
<a href="link">Linkname</a>
<p>Hello world</p>
Jquery не может преобразовать это в элемент, потому что он хочет преобразовать одно дерево элементов. Но у них нет контейнера. Следующий пример должен работать:
Правильный пример:
<div>
<a href="link">Linkname</a>
<p>Hello world</p>
</div>
Ответ 5
Почему бы вам просто не использовать метод загрузки?
$( "#wtf" ).load( "/echo/html #link" );
Или, здесь ваша скрипка исправлена и работает:
http://jsfiddle.net/hcrM8/4/
Ответ 6
Я столкнулся с одной и той же проблемой, и это происходит не потому, что вы делаете что-то неправильно.
потому что тег "link" не должен возвращать какой-либо innerHTML, он явно исключен в jquery, вы найдете некоторые, где находится эта строка:
rnoInnerhtml = /<(?:script|style|link)/i,
Этот тег в HTML должен ссылаться на внешнюю таблицу стилей.
Ответ 7
Все ответы не указывают на реальную проблему, jQuery, кажется, игнорирует тег head и body и создает массив узлов. Что вы обычно хотите, извлеките тело и проанализируйте его.
Взгляните на этот полезный ответ, я не хочу копировать его работу: fooobar.com/info/292100/....