-3
    jQuery.get("ajax.php", function(data)
    {
        $(data).find("div[id^='feed']").each(function() //Find every div with id starting with feed in AJAX response
            {
                $('#' + $(this).attr("id")).remove();
            });
        $("#newsfeed").prepend(data);
    });

这适用于在 ajax 响应中符合此描述的一些 div,但不是全部。提前致谢。

为了清楚起见,我想发送一个针对 HTML 的 AJAX 请求,遍历响应中的所有 div。如果他们与 DOM 中已有的东西共享一个 id 并且 id 以“feed”开头,则删除它们。然后将 AJAX 附加到新闻源的顶部。抱歉,如果我之前没有正确解释这一点。

4

2 回答 2

0

问题是您不能在 jQuery("html snippet") 构造上使用 .find 。您必须将其附加到 DOM 内的容器中,然后删除不需要的元素。例如:

$('#newsfeed').prepend(data).find('div[id^=feed]').remove();

编辑:删除其 ID 仅在响应中以 feed 开头的项目:

$('<div class="moar_feed">' + data + '</div>') // create detached elements from the data response, wrapping them inside a <div with class="moar_feed" (arbitrary class name, not even necessary)
.appendTo('#newsfeed') // add the newly created HTML elements to the #newsfeed. the return value of appendTo is the HTML you just created, so you can now call .find() on it
.find('div[id^=feed]') // find the DIVs with id starting with "feed" inside the newly created elements
.remove() // remove them from the DOM
于 2012-05-28T04:46:37.723 回答
0

我认为问题出在这部分:

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

于 2012-05-28T06:04:23.420 回答