2015-10-22 3 views
6

共通のクラスtargetの名前の要素が「使用可能」であるかどうかを調べる必要があります。これらの要素のどれも物理的にDOMに存在しません。これらの項目は、ページが完全にロードされた後に追加されました。バニラJavaScriptに動的に追加されたすべてのセレクタをクラス名で取得するにはどうすればよいですか?

var targets = document.getElementsByClassName('target); 

以下

I console.log(targets);は私が[]を取得します。私はそれらの角括弧をクリックすると

は、彼らが拡大し、 target項目が表示されているようだが、彼らに次のメッセージがあります:ログインしたときに左の

オブジェクトの値がスナップショットを作成して、ちょうど今 を評価した値を下回ります。

だから私は、DOMはまだtarget要素が取り込まれていないときに私はconsole.logをしたことを想定しています。どのように動的に追加された要素に関する情報を取得するのですか?

EDIT:

私はHSHの機能をチェックし

document.body.addEventListener('DOMSubtreeModified', function(event) { 
    var targets = document.getElementsByClassName('target'); 
    console.log(targets.length); 
    /** 
    * If I have 40 target elements, this will be called 40 times :/ showing first bunch of zeros then finally number will reach to 40 
    */ 
}); 

/** 
* So this would be ideally (called only once) but this always shows empty array and 0 
*/ 
document.addEventListener('DOMContentLoaded', function(event) { 
    var targets = document.getElementsByClassName('marker'); 
    console.log(targets); // always shows [] 
    console.log(targets.length); // always shows 0 

    //while I can play with those target selectors in Chrome Dev Tools 
}); 

PS。いいえjQueryしてください。

+2

スクリプトを最後のものとして ''タグに含めます。そうすることで、スクリプトを実行する前にDomがレンダリングします。 – jh3y

+1

@ jh3y - これは動的に追加されたものを捕まえません。(これらを追加するスクリプトは*と*は非同期ではありません)...質問が尋ねていることです。 – Quentin

+0

まさに! @クエンティンは正しい!それがポイントです。動的に追加されたものをキャッチする。 – slick

答えて

3

あなたはDOMContentLoadedイベントであなたのチェックスクリプトを呼び出すことができます:あなたは何かが、実行時に追加されることを期待している場合

document.addEventListener('DOMContentLoaded', function(event) { 
    var targets = document.getElementsByClassName('target'); 
    console.log(targets); 
}); 

また、あなたはDOMSubtreeModifiedイベントを使用することができます。

document.body.addEventListener('DOMSubtreeModified', function(event) { 
    var targets = document.getElementsByClassName('target'); 
    console.log(targets); 
}); 

JSFiddle

+0

@hsh、ありがとうございますが、コードが期待どおりに動作しません。私の編集した質問を見てください。 'DOMSubtreeModified'は' .target'アイテムの数だけ何度も起動されます。したがって、DOMContentLoadedは1回だけ実行されますが、空の配列と0を長さとして返すため、優れています。 – slick

+0

'getElementsByClassName'の結果が動的に更新されるときに、なぜこれを行う必要がありますか? –

0

あなたの質問は非常に紛らわしいです。

私が取得/「セレクタ」は、要素に対処/標的とする方法であるどのように多くのセレクタ

カウントする必要があります。セレクタは、要素を検索または一致させるために使用されます。例えば、.fooは、セレクタであり、の要素とクラス"foo"と一致します。あなたの場合は、の要素数を取得/カウントしたいということです。

一般的なクラスのターゲット名を持つ要素の数を取得/カウントする必要があります。これらの要素のどれも物理的にDOMに存在しません。

要素は使用できますが、DOMでは使用できません。どういう意味ですか?

これらの項目は、ページが完全にロードされた後に追加されています。

完全にロードされたとはどういう意味ですか? DOMContentLoadedと同じですか?または、すべてのJSがページを構築するのに役立つという意味で完全にロードされている?

最も簡単なことは、要素を追加するすべてのロジックが終了してから、getElementsByClassNameを評価するまで待つことです。どうしてそんなことはできないの? getElementsByClassNameがライブを返しますので、

以前getElementsByClassNameを評価するいくつかの理由で、またはページのロードの場合は、任意の時点でそれを見つけることがまだは、要素の最新のリストを反映していますコレクションは、ドキュメントが変更されると更新されます。つまり、ロード時に何かを実行する必要はなく、DOMSubtreeModifiedなどの不可解なイベントを監視する必要もありません。

要素が追加された後も含めて、targetsの値にはそのクラスのすべての要素が含まれ、targets.lengthにはそのような要素の合計数が表示されます。 MDNから

elementsが見つかった要素のライブ HTMLCollectionです。

+0

一度すべて追加されたら、どうやって入手するのですか?たぶん私は40項目を言うことを追加することを追加することを忘れて、それはすべてです。新しいアイテムは決して再び追加されません。 – slick

+0

追加された後、 'targets'の値はそれらすべてを含み、' targets.length'は総数を与えます。 –

関連する問題