2009-08-27 2 views
43

У меня есть div с идентификатором «secondHeader», и я хочу заменить весь этот div на другой div с тем же идентификатором «secondHeader», но вместо заменив его, он просто добавляет загруженный div внутри первого.Как я могу использовать jQuery.load для замены div, включая div

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

Это то, что происходит ...

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

То, что я хочу, чтобы это произошло это secondHeader делений от Аякса нагрузки, чтобы полностью заменить secondHeader на начальной странице.

Я знаю, это звучит глупо, но вот что я пытаюсь выполнить ... Когда пользователь не вошел в систему, они видят невостребованный заголовок. Я использую ajax, чтобы позволить человеку войти в сайт, и я хочу заменить невостребованный заголовок с помощью входа в систему через ajax.

Я пробовал все, что я знаю, такие как ...

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

... и используя .remove(), прежде чем руки ...

Есть идеи?

+2

Я знаю, что это очень старый, но вы также можете сделать это: $ ("# secondHeader ") .parent(). load ("/logged-in-content.html #secondHeader "); –

+0

@ jth_92 Если это хорошая идея, поставьте его в качестве ответа и дайте ему позаботиться о себе. Как это бывает, что перезаписывает всех братьев и сестер #secondHeader, поэтому он должен быть внизу. – Noumenon

+2

@Noumenon Это правда, что он перезапишет братьев и сестер; в DOM, однако, внутренний #secondHeader не имеет братьев и сестер. Он выглядит как оболочка всего содержимого (т. Е. Заголовок, который должен быть заменен). Будучи оберткой всего контента, ни один из братьев и сестер не пострадал. –

ответ

42

Я думаю, что лучший способ - использовать вместо загрузки. В вашем случае вы можете сделать так:

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

[Edit: удалили скобка]

Update: Если /logged-in-content.html имеет больше, чем просто код вам нужно, вы можете оберните возвращаемые данные в другой объект jQuery и используйте .find() для извлечения контейнера. Попробуйте следующее:

$ ("# secondHeader"). ReplaceWith ($ (data).найти ("# secondHeader"));

+28

Я не понимаю, почему это признанный и наиболее одобренный ответ. Переменная 'data' там фактически будет содержать все содержимое'/logged-in-content.html' not '/logged-in-content.html # secondHeader', как вы могли бы предположить из кода. Итак, '$ (" # secondHeader "). ReplaceWith (data);' фактически вставляет всю страницу там. – srcspider

+1

Это решение действительно сработало для меня, потому что я использовал его, чтобы «получить» файл php, содержащий только тот код, который я хотел. Спасибо за ответ! – Michael

55

Не могли бы вы уточнить свой селектор в методе load()?

Например,

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

Таким образом, вы не захватывая сам DIV, вы схватив его содержимое.

+0

Спасибо за ваше предложение. Я на самом деле пробовал это, но он возвращается действительно фанки и не все, как один сплоченный div. – vipergtsrz

+0

как насчет загрузки удаленного контента во временный div. Затем по обратному вызову, после этого, просто переместите содержимое по своему желанию. Это будет «работать», но, вероятно, не идеальный или ужасно элегантный подход.Ключ будет делать это в обратном вызове метода «load», чтобы дать время для завершения содержимого. Я снова посмотрел на ваш оригинальный пост и, возможно, этот вопрос времени - это то, что заставляет ваши оригинальные идеи не работать для вас ... – Funka

+0

Хммм, интересно, что селектор '#secondHeader> *' не работает для вас. У меня только сегодня была аналогичная потребность (я хочу только содержимое удаленного div, а не самого закрывающего div), и подумал, что я попробую. Он отлично работает в моем случае, как и ожидалось. – Funka

2

$ .load - это не лучший выбор здесь, поскольку эта функция предназначена только для заполнения содержимого div, как вы видели. Вместо этого вы можете использовать $.get и установить функцию обратного вызова, чтобы заменить исходный div или изменить logged-in-content.html, чтобы исключить div.

Также имейте в виду, что в качестве Javascript-решения, если ваши пользователи будут смотреть на источник, они увидят, что они могут получить доступ к logged-in-content.html, просто набрав его в своей адресной строке, если вы «Это еще не так.

+0

Я бы рекомендовал хранить ваши заголовки в отдельных файлах и загружать их по мере необходимости. – Olivieri

+0

Это тот же заголовок, и он использует элемент управления loginview asp.net. Я не думаю, что это было бы очень важно, если бы они были в разных файлах, потому что у меня была бы такая же проблема. Я попытаюсь использовать метод $ .get, но то, что мне действительно понравилось в $ .load, было то, что я мог выбрать только ту часть, которая мне нужна/нужна, и я не думаю, что могу использовать эту функциональность с помощью $ .get – vipergtsrz

0

Вы хотите обернуть div, прежде чем вставлять его.

$.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

Спасибо за код Jourkey. Я просто попробовал, и, похоже, он не делает то, что мне нужно. Он просто принимает отдельные элементы и добавляет их по одному в неиерархическом порядке, поэтому он не сохраняет ту же самую структуру, что мне нужно. Я все еще пытаюсь найти решение. – vipergtsrz

0

Можете ли вы добавить контейнер DIV вокруг своего div «secondHeader»? Тогда вы будете использовать:

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

Другой способ, который работает лучше для меня:

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

Это единственное предложение в этой теме, которое сработало для меня, остальные просто заменили div на весь HTML. – galaxyAbstractor

+3

Это был самый чистый ответ, который мне удалось получить. Ницца. – cfx

8

Final Ответ:

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

JQuery load добавляет ответ в элемент выбран. jQuery's replaceWith ЗАМЕНЯЕТ выбранный элемент.

<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 

Я предлагаю добавить функцию к JQuery, что делает как:

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

У меня всегда есть функция JQuery, определенный следующим образом:

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

Тогда я могу либо сказать

$(...).load(url) 

или

$(...).loadOuter(url) 

Вторая делает то, что вы хотите. У меня также есть функция loadInner, которая просто вызывает нагрузку для того, что ее стоит.

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

или как функция

$.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

После того, как вы загрузили содержимое, найти своих детей #second и разворачивать его.

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

Я имел этот вопрос, как хорошо, но я был в состоянии использовать .load путем реорганизации кода следующим образом: (нефрит)

div#view 
    div.content 
     block content 

и сценарий, как так ...

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

так нацеливайте ребенка вместо того же тега.

2

Использование $ .get() работал для меня, но я должен был извлечь контейнер из ответа первого:

$.get("/page.html", function (data) { 
    var elem = $(data).find('#container'); 
    $("#puthere").replaceWith(elem); 
}); 
Смежные вопросы