2011-01-19 12 views
1

each()ループを使用したときのjqueryの動作は?それは次のとおりです。第一の目的のためにjQuery each()ループ内のDOMを変更する場合の動作

  1. 見て、次のオブジェクトを探して、関数を実行...
  2. は、(
  3. 他のそれらのそれぞれに機能を実行し、コンテナ内のすべてのオブジェクトを収集するもの正確に)

それが関連している例、:?

<div id="a"> 
    A 
    <div id="b"> 
     B 
    </div> 
</div> 
<div id="c"> 
    C 
</div> 

私はこのJavaScriptを実行した場合:

$('div').each(function(index){ 
    alert($(this).html()); 
    $(this).remove(); 
} 

3つのアラートが表示されますか、2つだけ表示されますか。

+0

私は既に書式を修正しました。エディタで '{}'のように見える書式設定のための特別なボタンがあります。 –

+0

最後の質問については、3つのアラートが表示されます。http://jsfiddle.net/yahavbr/5fdU5/ –

+0

@ Shadow Wizard - {}ボタンとHTMLタグ内で使用したとき、エスケープして、私はABCを見ただけで、私の例ではdivsではなかった。私は間違ったことをしましたか? –

答えて

3

選択にどのようなアクションを実行するかにかかわらず、jQueryはそのアクションを適用する前にその選択を行います$('div')がセレクタであることを意味し、セレクションプロセスは、他のチェーンメソッド(例えば、each())に関係なく、前に行われます。 $()はメソッドを呼び出す前に評価する必要があるため、これは言語の産物です。

その選択肢がページから3つのdivを取得した場合、リスト内に3つのjQueryオブジェクトがあり、繰り返し処理できる状態になります。 あなたはをすることによってこれを証明することができます:あなたは3つのインデックスと配列を反復している

したがって
$('div').length 

(0、1、2)、あなたはインデックス1、の次の反復のためのDOMからのdivを削除する場合

DEMO:あなたが#2で説明してきたようにhttp://jsfiddle.net/marcuswhybrow/HYJa4/

+0

これはちょっと誤解を招いています。本当に '$( 'div')'を最初に実行した後、 'each()'を実行するjavascriptで、 – davin

+0

@davin jQueryはJavascriptです。それにもかかわらず、それが言語評価プロセスの産物であると言っているのであれば、あなたの言葉は立っています。 –

+0

それは正確に私が参照していたものです – davin

0

jQueryのように動作するeach()コールバックはまだ指数2.チェックアウト時にオブジェクトのための証明のため、このライブデモになります。 div Bは、divの内部にあることから、しかし

  1. "< div>のB </div>の"
  2. "B"
  3. "C"

:次の3つのアラートが表示されますA、それはdiv Aで取り除かれます。jQueryはまだそれについて知っていて、その内容を警告しますが、その時間までにすでに削除されています。したがって、3つのアラートが表示されますが、子要素が削除されるため、2つの削除のみが実行されます。

0

2が答えです。

jQueryは一致する要素のリストを収集し、リストをループします。

重要なことだと思いますが、まだ処理されていないアイテムを削除しないでください。そうしないと、参照が見つかりませんでした。

+0

本当に(エラーを得る危険にさらされていますか?)上記の例は、ループ内の要素をさらに削除している間もエラーがないことを示しているようです(jQueryオブジェクト内にまだ保持されているため) - 間違っていますか? –

+0

DOM要素を削除した場合、jQueryは、兄弟要素に要素にアクセスしようとすると、特にそうです。削除した場合は、DOMのonger部分ではなく、DOM内の要素位置に関する情報を返すメソッドは失敗します。 –

関連する問題