2009-08-27 15 views
43

Tengo un div con el id de "secondHeader" y quiero reemplazar ese div completo con otro div con el mismo id de "secondHeader" pero en lugar de reemplazándolo, simplemente agrega el div cargado dentro del primero.¿Cómo puedo usar jQuery.load para reemplazar un div incluyendo el div

$("#secondHeader").load("/logged-in-content.html #secondHeader"); 

Esto es lo que sucede ...

<div id="secondHeader"><div id="secondHeader"></div></div> 

Lo que quiero que suceda es el div secondHeader de la carga ajax para reemplazar por completo la secondHeader en la página inicial.

Sé que suena tonto, pero esto es lo que estoy tratando de lograr ... Cuando un usuario no está conectado, se ve un encabezado no conectado. Estoy usando ajax para permitir que la persona inicie sesión en el sitio y deseo reemplazar el encabezado no registrado con el que está conectado a través de ajax.

he intentado todo lo que sé como ...

$("#secondHeader").replaceWith($("#secondHeader").load("/logged-in-content.html #secondHeader")); 

... y el uso de .Remove() antes de la mano ...

¿Alguna idea?

+2

Sé que esto es muy antiguo, pero que también podría hacer esto: $ ("# secondHeader ") .parent(). load ("/logged-in-content.html #secondHeader "); –

+0

@ jth_92 Si esa es una buena idea, póngalo como una respuesta y déjelo a su suerte. Sucede que sobrescribe todos los hermanos de #secondHeader, por lo que debe estar en la parte inferior. – Noumenon

+2

@Noumenon Esto es cierto que sobrescribirá a los hermanos; en el DOM publicado, sin embargo, el #secondHeader interno no tiene hermanos. Parece ser un contenedor de todo el contenido (es decir, el encabezado que se debe reemplazar). Al ser un contenedor de todo el contenido, ningún hermano se ve afectado. –

Respuesta

42

Creo que la mejor manera es utilizar get en lugar de cargar. En su caso se puede hacer así:

$.get("/logged-in-content.html #secondHeader", function(data) { 
    $("#secondHeader").replaceWith(data); 
}); 

[Editar: se ha eliminado una paren]

Actualización: Si /logged-in-content.html tiene algo más que el código que necesita, puede envuelva los datos que regresan en otro objeto jQuery y use .find() para extraer el contenedor. Pruebe esto:

$ ("# secondHeader"). ReplaceWith ($ (datos).find ("# secondHeader"));

+28

No entiendo por qué esta es la respuesta aceptada y más votada. La variable 'data' en realidad contendrá todo el contenido de'/logged-in-content.html' not '/logged-in-content.html # secondHeader' como podría suponerse desde el código. Entonces '$ (" # secondHeader "). ReplaceWith (data);' en realidad está insertando toda la página allí. – srcspider

+1

Esta solución realmente funcionó para mí porque la estaba usando para 'obtener' un archivo php que solo contenía el código que yo quería. ¡Gracias por la respuesta! – Michael

55

¿Podría refinar su selector en el método load()?

Por ejemplo,

$("#secondHeader").load("/logged-in-content.html #secondHeader > *"); 

De esta manera, usted no está agarrando el div en sí, que está agarrando su contenido.

+0

Gracias por su sugerencia. De hecho, lo intenté, pero me parece realmente funky y no todo como un div cohesivo. – vipergtsrz

+0

¿qué hay de cargar el contenido remoto en un div temporal. Luego, en la devolución de llamada, después de hacer esto, simplemente cambie el contenido como desee. Esto "funcionaría", pero probablemente no sea un enfoque ideal o terriblemente elegante.La clave será hacer esto en la devolución de llamada del método "load", para dar tiempo a que el contenido termine de recuperarse. Miré su publicación original nuevamente y tal vez este problema de tiempo es lo que está causando que sus ideas originales no funcionen para usted ... – Funka

+0

Hmmm, es interesante que el selector '# second cabecera> *' no funcione para usted. Solo hoy tenía una necesidad similar (solo quiero el contenido del div remoto, no el div que lo rodea) y pensé en probarlo. Funciona muy bien en mi caso, exactamente como se esperaba. – Funka

2

$ .load no es realmente la mejor opción aquí ya que esa función está destinada a completar el contenido de un div, como ya has visto. En su lugar, puede usar $.get y configurar la función de devolución de llamada para reemplazar su div original, o cambiar el contenido registrado.html para excluir el div.

Además, tenga en cuenta que, como una solución basada en Javascript, si los usuarios miran la fuente, verán que pueden obtener acceso a la sesión en el contenido.html con solo escribirla en la barra de direcciones si No lo estoy asegurando de alguna otra manera.

+0

Yo recomendaría mantener sus encabezados en archivos separados y cargarlos según sea necesario. – Olivieri

+0

Es el mismo encabezado y utiliza un control loginview asp.net. No creo que importaría mucho si estuvieran en archivos diferentes porque tendría el mismo problema. Voy a probar el método $ .get, pero lo que realmente me gustó de $ .load fue que pude seleccionar solo la parte que quería/necesitaba y no creo que pueda usar esa funcionalidad con $ .get – vipergtsrz

0

Quiere envolver en div antes de insertarlo.

$.ajax({ 
    url: "/logged-in-content.html", 
    success: function(response){ 
     var loadedheader = $("<div/>").append(
     response.replace(/<script(.|\s)*?\/script>/g, "") 
     ).find('#secondHeader > *').html(); 
     $("#secondHeader").append(loadedheader); 
    } 
}); 
+0

Gracias por el código Jourkey. Lo intenté y parece que no hace lo que necesito. Simplemente toma elementos individuales y los agrega de a uno de forma no jerárquica, por lo que no conserva la misma estructura dom que yo necesito. Todavía estoy tratando de encontrar una solución. – vipergtsrz

0

se puede añadir un DIV contenedor alrededor de su div "secondHeader"? Entonces usaría:

$('#secondHeaderContainer').load('/logged-in-content.html #secondHeader'); 
25

Otra forma en que funcionaba mejor para mí:

$('#div_to_replace').load('/ajax/loader', function() { 
    $(this).children(':first').unwrap(); 
}); 
+0

Esta es la única sugerencia en este hilo que funcionó para mí, los otros simplemente reemplazarían el div con el HTML completo – galaxyAbstractor

+3

Esta fue la respuesta más limpia que logré para trabajar. Bonito. – cfx

8

respuesta final:

$.fn.loadWith = function(u){var c=$(this);$.get(u,function(d){c.replaceWith(d);});}; 
$("#test").loadWith("somelink.html"); 

jQuery load añade la respuesta en el elemento seleccionado. jQuery's replaceWith SUSTITUYE el elemento seleccionado.

<div id="curElement">start</div> 

$("#curElement").load("somelink.html"); 
will result in: 
<div id="curElement">What ever was in somelink.html</div> 


$("#curElement").replaceWith("somelink.html"); 
will result in: 
What ever was in somelink.html 

Yo sugiero agregar una función para jQuery que hace las dos cosas:

$.fn.loadWith = function(u){ 
    var c=$(this); 
    $.get(u,function(d){ 
     c.replaceWith(d); 
    }); 
}; 
$("#test").loadWith("somelink.html"); 
2

siempre tengo una función jQuery se define así:

jQuery.fn.loadOuter = function(url, callback) 
    { 
     var toLoad = $(this); 
     $.get(url, function(data) { 
      toLoad.replaceWith(data); 
      if (callback != null && callback != undefined) 
       callback(); 
     }); 
    } 

Entonces puedo tampoco decir

$(...).load(url) 

o

$(...).loadOuter(url) 

El segundo hace lo que quiere hacer. También tengo una función llamada loadInner que solo llama carga por lo que vale.

1
var target = '#secondHeader'; 
var pathname = '/logged-in-content.html'; 
var source = pathname + ' ' + target; 
var temp = jQuery('<div></div>'); 
temp.load(source, function() { 
jQuery(target).replaceWith(temp.contents()); 
}); 

o como función

$.fn.replaceWithRemote = function(source, callback) { 
    var target = $(this); 
    var temp = $('<div></div>'); 
    temp.load(source, function() { 
     target.replaceWith(temp.contents()); 
     if (callback != null){ 
      callback(); 
     } 
    }); 
} 

$('#secondHeader').replaceWithRemote('/logged-in-content.html #secondHeader'); 
1

Después de haber cargado el contenido, los niños encuentran su #second y desenvolverlo.

$("#secondHeader").children().unwrap(); 
-2

tuve este problema también, pero yo era capaz de utilizar .load mediante la reestructuración del código de este modo: (jade)

div#view 
    div.content 
     block content 

y el guión como tal ...

$("#view").load($(this).attr("href") + " div.content") 

, por lo tanto, seleccione el elemento secundario en lugar de la misma etiqueta.

2

Usando $ .get() trabajado para mí, pero tenía que extraer el contenedor desde el primer documento de respuesta:

$.get("/page.html", function (data) { 
    var elem = $(data).find('#container'); 
    $("#puthere").replaceWith(elem); 
}); 
Cuestiones relacionadas