2011-07-29 6 views
3

私はdojo.queryを使用しています。これは内部的にCSS3セレクタを使用して、どの要素を取得するのかを識別します。「子孫ではない」または「最も外側にある」というCSS3セレクタ?

私が探しているのは、タグ "foo"を持つすべての要素ですが、最も外側のもの(つまり、1つの "foo"が別のものの内部に埋め込まれていて、それらを無視したい)です。外側の要素は、文書のどのレベルにも現れ、他のほとんどの要素の中に入れ子になっています。

もちろん、dojo.query('foo')は入れ子にされたもの(私が欲しくないもの)を含むすべてのfoo要素を返します。

次回の試行はdojo.query('foo:not(foo foo)')でしたが、結果は返されません(子孫セレクタは「シンプルセレクタ」でないため、:notでサポートされていません)。

この種の通常のCSSレベルの解決策は、ネストされた要素を別々に扱えるように、2つのルール(foofoo foo)を定義することです。しかし、この場合は動作しません(これは単なる選択であるため)。 (ネストされた要素には最初のルールが適用されているため、最初のルールをオーバーライドするためにブラウザまたは親のデフォルト値を使用することは不可能になるため、実際のCSSでもうまく機能しません)。

それが助けになるならば、少なくとも一つのfooが別のものの中にある瞬間に、彼らは直接的な子供でなければなりませんが、彼らは任意のレベルにネストすることができます。 (。つまり、「foo>のFOO」も成功し、すべてのネストされたfooという要素にマッチしますが、残念ながらそれはまだ私が何をしたいの反対です。)

を編集:現時点で私が使用している回避策はあるが、以下の通りです私はまだ(間接ネスティングが可能な場合には、多くの祖先セーフ)もう少しエレガントな何かを望んでいる:

dojo.query('foo').forEach(function(foo) { 
    if (foo.parentNode.localName == 'foo') { return; } 
    // ... 
}); 
+0

いつものように:祖先CSSセレクタはありません。 – BoltClock

答えて

1

それは常に直接の子孫になるならば、あなたは

dojo.query("foo").filter(function(item) { 
    return (item.parentNode.nodeName.toLowerCase() !== "foo"); 
}) 
を行うことができます
+0

これはちょっとした解答にぴったりです。私はこれを目安にしていますが、もう少し洗練されたものを望んでいました。現在の回避策を含めるように質問を編集しました。 – Miral

関連する問題