我认为问题出在这部分:
$(data).find("div[id^='feed']")
当您将一个 html 字符串传递给 jQuery 时,就像您对 jQuery 所做的那样$(data)
,jQuery 创建 DOM 元素以匹配该字符串(这些元素最初与文档分离),然后返回一个仅包含顶级元素的 jQuery 对象。也就是说,如果您的字符串包含嵌套元素,则所有元素都会被创建,但在 jQuery 对象中只返回顶级元素。
.find("div[id^='feed']")
然后查找作为上一步中创建的 jQuery 对象中的元素的后代的 div 元素,因此它不会匹配任何顶级元素。
该.filter()
方法允许您过滤顶级元素,因此您可以执行以下操作:
jQuery.get("ajax.php", function(data)
{
var $newEls = $(data);
$newEls.filter("div[id^='feed']")
.add( $newEls.find("div[id^='feed']") )
.each(function() {
$('#' this.id).remove();
});
$("#newsfeed").prepend(data);
});
内.each()
你可以说this.id
而不是$(this).attr("id")
。
一些示例 html 可能有助于澄清我在上面试图解释的内容。鉴于:
data = "<div id='feed1'><div id='feed2'/><div id='xyz'/></div>
<div id='abc'><div id='feed3'/></div>";
(忽略仅为可读性而存在的换行符)
然后$(data)
将创建所有五个 div,但返回一个仅包含 'feed1' 和 'abc' div 的 jQuery 对象,因为它们是唯一的顶级对象。
$(data).find("div[id^='feed']")
返回一个仅包含 'feed2' 和 'feed3' div 的 jQuery 对象,因为它们是$(data)
jQuery 对象中元素的唯一后代。
$(data).filter("div[id^='feed']")
返回一个仅包含 'feed1' div 的 jQuery 对象。
编辑:你可以用这样的东西来简化它:
jQuery.get("ajax.php", function(data)
{
$("<div/>").append(data).find("div[id^='feed']").each(function() {
$('#' this.id).remove();
})
$("#newsfeed").prepend(data);
});
这将创建一个完全空的 div 作为容器,以便您可以.find()
在该容器中使用并取消.filter()
.