2

$.each()jQueryループのクロージャーの外側で定義された要素を繰り返し追加しようとしています-http://jsfiddle.net/benedict_w/8Pczs/を参照してください

要素がループの最後の反復でのみ追加される理由を誰かが説明してもらえますか?

例えば

<ul>
    <li>blah</li>
    <li>blah</li>
    <li>blah</li>
</ul>

次の jquery を使用します。

var remove = $('<a href="#">remove</a>');
$('li').each(function(){
    $(this).append(remove);       
});​

生産者:

<ul>
    <li>blah</li>
    <li>blah</li>
    <li>blah <a href="#">remove</a></li>
</ul>
4

5 に答える 5

7

毎回同じ要素を追加しています。
追加するたびに、次の に移動します<li>

clone()反復ごとに要素を作成する (または単に再作成する)必要があります。

于 2012-09-13T16:51:43.717 に答える
2
$('<a href="#">remove</a>').appendTo('li');

liこれにより、不要なループや jQuery オブジェクトの作成を回避しながら、それぞれに新しい要素が追加されます。

ただし、ターゲット要素が複数ある場合は、挿入された要素のクローン コピーが最初のターゲットの後にターゲットごとに作成され、その新しいセット (元の要素とクローン) が返されます。

http://api.jquery.com/appendTo/

于 2012-09-13T16:53:42.160 に答える
1

挿入する要素を複製する必要はありません。の定義によると、append()

$('li').append('<a href="#">remove</a>'); 
//will append an <a> to every <li> in the "set of matched elements"

デモ

UPDATE : 他のことをするためにイテレータが必要な場合はeach()、要素をクロージャー内で定義してみませんか?

$('li').each(function(){
    var remove = $('<a href="#">remove</a>');
    $(this).append(remove);       
    //do other things
});​

更新2:OPのコメントから学んだことから、最新の回答を維持するだけです

あなたの質問では、1 つの一意の要素 (クロージャの外側で定義されている) への参照があるためです。これは、最初の反復で DOM に追加されます。次回、同じ要素を DOM の別のノードに追加しようとするとき。jQuery はそれを認識し、それをその場所から切り離し、別のドキュメント フラグメントを作成し、それを DOM の新しいターゲットにアタッチします。

于 2012-09-13T16:52:48.183 に答える
0

変数「remove」をプレーンテキストとして定義します。つまり、

var remove = '<a href="#">remove</a>';
于 2012-09-13T16:54:53.630 に答える
0
var remo[enter link description here][1]ve = $(

あなたのコードを台無しにしています。要素を追加しているため、それが発生しています..セレクターの代わりに文字列として渡すか、オブジェクトを複製するだけです..これで作業が完了します.

var remove = '<a href="#">remove</a>' ;
$('li').each(function(){
    $(this).append(remove);       
});​

また、appendTo を使用して反復を回避することもできます

$('<a href="#">remove</a>').appendTo('li');

UPDATED FIDDLEをチェックしてください

于 2012-09-13T16:55:39.060 に答える