Получить содержимое <body></body> в строке - PullRequest
3 голосов
/ 01 июня 2011

Я хочу сделать следующее.

$("a").click(function (event) {

    event.preventDefault();

    $.get($(this).attr("href"), function(data) {

        $("html").html(data);

    });

});

Я хочу, чтобы поведение всех гиперссылок вызывало ajax и получало html.

К сожалению, вы не можете просто заменить текущий html на html, полученный в ответе ajax.

Как получить только то, что находится в тегах <body> </body> ответа ajax, чтобы я мог только заменить содержимое тела в существующем html.

Редактировать: открывающий тег <body> не всегда будет просто <body>, иногда он может иметь класс, например

<body class="class1 class2">

Ответы [ 3 ]

9 голосов
/ 01 июня 2011

Если я вас правильно понимаю, возьмите содержимое между тегами тела с помощью регулярного выражения.

$.get($(this).attr("href"), function(data) {
    var body=data.replace(/^.*?<body>(.*?)<\/body>.*?$/s,"$1");
    $("body").html(body);

});

EDIT

Основываясь на ваших комментариях ниже, вот обновление для соответствия любому тегу тела, независимо от его атрибутов:

$.get($(this).attr("href"), function(data) {
    var body=data.replace(/^.*?<body[^>]*>(.*?)<\/body>.*?$/i,"$1");
    $("body").html(body);

});

Регулярное выражение:

^               match starting at beginning of string

.*?             ignore zero or more characters (non-greedy)

<body[^>]*>     match literal '<body' 
                    followed by zero or more chars other than '>'
                    followed by literal '>'

(               start capture

  .*?           zero or more characters (non-greedy)

)               end capture

<\/body>        match literal '</body>'

.*?             ignore zero or more characters (non-greedy)

$               to end of string

Добавьте переключатель «i» для соответствия верхнему и нижнему регистру.

И, пожалуйста, игнорируйте мой комментарий относительно переключателя 's', в JavaScript все RegExp по умолчанию уже однострочные, чтобы соответствовать многострочному шаблону, вы добавляете 'm'. (Черт возьми, Perl, мешающий мне, когда я пишу о JavaScript!: -)

0 голосов
/ 04 марта 2017

Я не хотел связываться с регулярными выражениями. Вместо этого я создал скрытый <iframe>, загрузил в него содержимое и извлек <body> со страницы в <iframe> в onload().

страницы.

Мне нужно было быть осторожным с Политика того же происхождения для iframe (эта статья показала путь):

var iframe = document.createElement('iframe');
iframe.style.display = "none";
jQuery('body').append(iframe);
iframe.contentWindow.contents = data;
iframe.onload = function () {
    var bodyHTML = jQuery(iframe).contents()
                        .find('body').html();
    // Use the bodyHTML as you see fit
    jQuery('#error').html(bodyHTML);
}
iframe.src = 'javascript:window["contents"]';

Просто удалите <iframe>, когда закончите ...

0 голосов
/ 01 июня 2011

Обязательно привязывайте события к документу, отфильтрованному по классу ($(document).on('click', '.my-class-name', doThings);). Если вы замените html тела, любые привязки событий, выполненные напрямую ($('.my-class-name').on('click', doThings);), будут уничтожены при перерисовке DOM с использованием нового html.,Переплет будет работать, но он также оставит кучу указателей от старых событий и узлов, которые сборщик мусора должен будет очистить - в более простых сроках страница может становиться все тяжелее и тяжелее, чем дольше она открыта.

Я не проверял это на нескольких платформах, используйте с осторожностью.

// create a new html document
function createDocument(html) {
  var doc = document.implementation.createHTMLDocument('')
  doc.documentElement.innerHTML = html
  return doc;
}
$("a").click(function (event) {
    event.preventDefault();
    $.get($(this).attr("href"), function(data) {
        $("body").html($(createDocument(data)).find('body').html);
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...