問題はこの部分にあると思います:
$(data).find("div[id^='feed']")
html の文字列を jQuery に渡すと、jQuery は文字列に一致する DOM 要素を作成し (これらの要素は最初はドキュメントから切り離されます) 、最上位の要素のみ$(data)
を含む 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)
、5 つの 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()
。