Obtener contenido de dentro de una cadena

Quiero hacer lo siguiente.

$("a").click(function (event) { event.preventDefault(); $.get($(this).attr("href"), function(data) { $("html").html(data); }); }); 

Quiero que el comportamiento de todos los hipervínculos haga llamadas ajax y recupere el html.

Desafortunadamente, no puede simplemente reemplazar el código HTML actual con el código HTML que recibe en la respuesta ajax.

¿Cómo puedo capturar solo lo que está dentro de las tags de la respuesta ajax para que pueda reemplazar solo el contenido del cuerpo en el html existente?

Edición: la etiqueta de apertura no siempre será solo a veces puede tener una clase, por ejemplo

Si te entiendo correctamente, toma el contenido entre las tags del cuerpo con una expresión regular.

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

EDITAR

En función de sus comentarios a continuación, aquí hay una actualización para que coincida con cualquier etiqueta del cuerpo, independientemente de sus atributos:

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

La expresión regular es:

 ^ match starting at beginning of string .*? ignore zero or more characters (non-greedy) ]*> match literal '' followed by literal '>' ( start capture .*? zero or more characters (non-greedy) ) end capture < \/body> match literal '' .*? ignore zero or more characters (non-greedy) $ to end of string 

Agregue el interruptor ‘i’ para que coincida con mayúsculas y minúsculas.

Y, por favor, ignore mi comentario con respecto al interruptor ‘s’, en JavaScript, todos los RegExp ya están en una sola línea por defecto, para que coincida con un patrón multilínea, agregue ‘m’. (¡Maldito seas Perl, interfiriendo conmigo cuando estoy escribiendo sobre JavaScript!) 🙂

No quería meterme con expresiones regulares. En su lugar, creé un oculto, cargué el contenido y extraje el de la página en el en la onload() la página.

Necesitaba tener cuidado con la política del mismo origen para el iframe (este artículo mostró el camino):

 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"]'; 

Simplemente quite el cuando haya terminado …

Asegúrate de vincular eventos al documento, filtrados por clase ( $(document).on('click', '.my-class-name', doThings); ) Si reemplaza el html del cuerpo, se realizarán todos los enlaces de eventos. directamente ( $('.my-class-name').on('click', doThings); ) se destruirá cuando se vuelva a dibujar el DOM usando el nuevo html. La reconexión funcionará, pero también dejará un montón de punteros de los antiguos eventos y nodos que el recolector de basura tendrá que limpiar; en términos más simples, puede hacer que la página se haga más y más pesada cuanto más tiempo esté abierta.

No he probado esto en múltiples plataformas, use con precaución.

 // 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); }); });