2009-08-27 56 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); 
});