Выберите содержимое в переменной, а не в текущей DOM с помощью jQuery? - PullRequest
5 голосов
/ 09 июля 2011

У меня есть функция ajax, использующая jQuery, которая определяет функцию ошибки, которая будет вызвана. Когда на сервере происходит ошибка, эта функция запускается. Одна из переменных, переданных в «jqXHR», содержит свойство с именем responseText. Я хочу поместить этот текст ответа в div на странице, но текст ответа содержит полностью сформированный HTML-документ. Есть ли способ использовать jQuery для обхода этой переменной, содержащей HTML, так же, как я бы проходил через обычный DOM?

$.ajax({
    blah blah blah...,
    error: function (jqXHR, textStatus, errorThrown)
    {
        var errorText = $(jqXHR.responseText).find('body').html();
        // The above line does not work. errorText is NULL.
        $('#mainContent').html(errorText);
    }
});

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

UPDATE

Вот это console.log($(jqXHR.responseText))

http://www.codetunnel.com/content/images/consolelog.jpg

Ответы [ 4 ]

3 голосов
/ 09 июля 2011

Это сладкое открытие для меня тоже об этом.

Это не работает, потому что за кулисами jQuery создает фрагмент документа и устанавливает для него свойство innerHtml. Этот не работает с узлами <html> и <body>, потому что это не типы узлов документов - их нельзя поместить в DOM.

Вместо этого, когда вы вызываете $('<html><body><b>foo</b></body></html>'), создается фрагмент с просто "<b>foo</b>" в нем! Итак, вы хотите только часть тела? Просто вернитесь:

$(jqXHR.responseText).html();

Скрипка, чтобы доказать, о чем я говорю: http://jsfiddle.net/L5PR5/1/


РЕДАКТИРОВАТЬ # 2

Я думаю, что ваш единственный выбор, учитывая, что туда вставляются <head> элементы, это использовать подстроки:

var res = jqXHR.responseText;
$(res.substring(res.indexOf('<body'))).appendTo('#mainContent');
2 голосов
/ 09 июля 2011

Попробуйте это:

var errorText = $('<div />').append(jqXHR.responseText).html();

а вот jsfiddle .

0 голосов
/ 09 июля 2011

Предполагая, что ваш HTML является действительным XML, вы можете сделать

var xmlDoc = $.parseXML( jqXHR.responseText ),
    body = $( xmlDoc ).find('body')[0],
    bodystring = body.xml || new XMLSerializer().serializeToString(body);

теперь bodystring содержит весь тег <body> ( в виде строки ), и вы можете использовать его для добавления его в DOM с помощью

$('#mainContent').html( bodystring );

демо на http://jsfiddle.net/gaby/hYukn/

0 голосов
/ 09 июля 2011

Использование .filter()

http://api.jquery.com/filter/

var myHtml = '<div id="blah">hello world</div>';
console.log($(myHtml).filter('#blah').html());

Это покажет "привет мир" в консоли. Это HTML хранится в переменной. Вы применяете фильтр () из jquery к этой переменной (см. Выше), и вы можете получить доступ к своему домену таким образом, даже если он находится в переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...