2011-01-13 7 views
2

新しく作成された要素(例:$("<div/>"))として生成され、親を持たないjQueryの選択、または実際にはDOMの要素です。jQueryの選択がDOM内にあるかどうかを確認

選択した要素が実際に現在のDOMツリーに存在するかどうかを判断する最も効率的な方法は何ですか?

1つの可能性は.parent()に電話することですが、より効率的な方法があると思われます。

+0

JavaScriptの実行を高速化しようとしている場合、これは大きな違いはありません。最初にプロファイリング作業を行い、実際に遅いものがあるかどうかを確認する必要があります。 parent()を100回呼び出しても、ミリ秒かかることはありません。 –

+0

@Mike、それはメソッドを呼び出す必要がある頻度に依存します。 – kpozin

答えて

2

となるだろう、私はその両方の私の質問を実現し、 Andyの解(node.parentNodeを使用)は一般化できる。少なくとも1つの祖先を持っていても、jQueryの選択にはフルバージョンがあります。

/** 
* Returns true if this selection is part of the current DOM; 
* false if it's a fragment. 
* @return {Boolean} 
*/ 
jQuery.fn.inDom = function() { 
    // Get the first element in the jQuery selection 
    var node = this[0]; 

    while (node) { 
     if (node.nodeType === Node.DOCUMENT_NODE) { 
      return true; 
     } 
     node = node.parentNode; 
    } 
    return false; 
} 
-1

新しく作成された要素にIDを与え、IDを問い合わせます。

+0

これはより効率的ですか?私はプロファイリングを要求する。 –

+0

何よりも効率的ですか? –

+0

IDがすでにDOMに存在する場合はどうなりますか? – AUSteve

0

jQuery index methodを参照してください。

$(yourDiv).index('body div')のようなものがたくさんあります。

4

.parent()を求めるアイデアはそれほど悪くはありませんが、実際にはかなり一般的な方法です。とにかく、.contains()メソッドを使用することもできます。

var newdiv = $('<div>'); 

if($.contains(document.body, newdiv[0])) { 
} 

参照:.contains()

例:http://www.jsfiddle.net/gGPav/

パフォーマンス:パフォーマンスを見てhttp://jsperf.com/contains-vs-parentnode

、私もnode.parentNode

+0

+1経験的な答えと私をjsPerfに紹介しました! – kpozin

+1

'.parentNode'をチェックするだけでは正確ではありません。要素は、DOM内で__isn't__されている別の要素の中にあるかもしれません。 'document.documentElement'をチェックしてください。 – Thai

+0

私はそれを認識し、私自身の答えを以下に加えました。 – kpozin

関連する問題