2009-08-27 74 views
43

我有一個的「secondHeader」 id的DIV,我想用「secondHeader」的相同ID的另一個div來替換整個格但不是替換它,它只是加載第一個加載的div。如何使用jQuery.load更換一個div包括股利

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

這是什麼情況?

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

我希望發生的就是從阿賈克斯負載secondHeader div來完全取代secondHeader在初始頁面。

我知道這聽起來很愚蠢,但在這裏就是我試圖完成......當用戶沒有登錄,他們看到一個非登錄的頭。我使用ajax來允許該用戶登錄該網站,並且我想通過ajax將未登錄的標題替換爲已登錄的標題。

我都試過,我知道等應有盡有......

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

...和手之前,使用一個.remove()...

任何想法?

+2

我知道這是非常老,但你也可以這樣做:$(「#secondHeader 「).parent()。load(」/ logged-in-content.html #secondHeader「); – 2013-01-14 15:58:26

+0

@ jth_92如果這是一個好主意,把它作爲一個答案,並讓它爲自己謀生。碰巧覆蓋#secondHeader的所有兄弟,所以它應該在底部。 – Noumenon 2015-11-09 20:59:47

+2

@Noumenon這是真的,它會覆蓋兄弟姐妹;在發佈的DOM中,內部#secondHeader沒有兄弟。它似乎是所有內容的封裝(即要替換的標題)。作爲所有內容的包裝,沒有兄弟姐妹受到影響。 – 2015-11-10 13:36:01

回答

42

我認爲最好的方法是使用get而不是load。你的情況,你可以這樣做:

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

[編輯:刪除一個括號]

更新: 如果/logged-in-content.html已經不僅僅是你需要的代碼,您可在將返回的數據封裝在另一個jQuery對象中,並使用.find()來提取容器。 試試這個:

$( 「#secondHeader」)replaceWith($(數據)。找到( 「#secondHeader」));

+28

我不明白爲什麼這是被接受且最有回報的答案。這裏的變量'data'實際上會包含'/ logged-in-content.html'的全部內容,而不是''像'''''''''''''所以'$(「#secondHeader」)。replaceWith(data);'實際上是在那裏插入整個頁面。 – srcspider 2012-07-09 08:35:22

+1

這個解決方案實際上對我來說很合適,因爲我使用它來獲取只包含我想要的代碼的php文件。感謝你的回答! – Michael 2013-10-04 03:26:24

55

你可以在load()方法中精煉你的選擇器嗎?

例如,

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

這樣,你不抓住DIV本身,你抓住它的內容。

+0

感謝您的建議。我實際上已經嘗試過,但它真的很時髦,並不是全部都是一個有凝聚力的div。 – vipergtsrz 2009-08-28 02:07:38

+0

如何將遠程內容加載到臨時div中。然後在回調中,完成此操作後,根據需要簡單地重新定位內容。這將「起作用」,但可能不是理想的或非常優雅的方法。關鍵是要在「load」方法的回調中做到這一點,以便有時間讓內容完成檢索。我再次看了你原來的帖子,也許這個時機問題是什麼導致你的原創想法不適合你... – Funka 2009-08-28 17:03:52

+0

嗯,有趣的是'#secondHeader> *'選擇器不適合你。我只是今天有類似的需求(我只想要遠程div的內容,而不是封閉的div本身),並認爲我會試試這個。它和我的情況非常相似,完全如預期。 – Funka 2009-08-28 21:40:43

2

$ .load並不是真正的最佳選擇,因爲該函數只是用來填充div的內容,正如您所看到的。您可以直接使用$.get,並設置回調函數來替換原始div,或更改logged-in-content.html以排除div。

也知道,作爲一個基於JavaScript的解決方案,如果用戶查看源代碼,他們會看到,他們可以得到訪問由剛剛在他們的地址欄中鍵入它登錄-content.html如果您其他方面沒有保護它。

+0

我建議您將標題保存在單獨的文件中並根據需要加載它們。 – Olivieri 2009-08-27 22:44:52

+0

這是相同的頭文件,它使用了一個loginview asp.net控件。如果他們在不同的文件中,我不認爲這很重要,因爲我會遇到同樣的問題。 我會嘗試$ .get方法,但是我真正喜歡$ .load的是我可以只選擇我想要/需要的部分,我不認爲我可以使用$ .get – vipergtsrz 2009-08-28 02:10:36

0

在插入它之前,您想要用div封裝。

​​
+0

感謝代碼Jourkey。我只是試了一下,似乎沒有做到我所需要的。它只需要單獨的元素並以非分層的方式一次添加它們,因此它不會保留我需要的dom結構。我仍然在努力尋找解決方案。 – vipergtsrz 2009-08-28 13:26:10

0

你可以在你的「secondHeader」div上添加一個容器DIV嗎?那麼你會使用:

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

爲我工作最好的另一種方式:

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

這是這個線程中唯一對我有用的建議,其他人只會用整個HTML代替div – galaxyAbstractor 2013-04-14 11:38:09

+3

這是我設法工作的最乾淨的答案。尼斯。 – cfx 2013-12-29 05:50:40

8

最終的答案:

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

jQuery的load元素添加到選擇的元素的響應。 jQuery的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的函數,它只是調用load來表示它的價值。

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("/page.html", function (data) { 
    var elem = $(data).find('#container'); 
    $("#puthere").replaceWith(elem); 
});