私はこれができます:
<div id="myDiv">
<div class="foo"></div>
</div>
myDiv = getElementById("myDiv");
myDiv.querySelectorAll("#myDiv > .foo");
つまり、myDiv
クラスを持つ要素の直接の子をすべて正常に取得できます.foo
。
問題は、要素#myDiv
に対してクエリを実行しているため、セレクターにを含める必要があることですmyDiv
(したがって、明らかに冗長です)。
を省略できるはずです#myDiv
が、セレクターは で始まるため、有効な構文ではありません>
。
セレクターが実行されている要素の直接の子だけを取得するセレクターの書き方を知っている人はいますか?
ベストアンサー1
いい質問ですね。質問された当時は、「コンビネータルートクエリ」を実行するための普遍的に実装された方法(ジョン・レシグは彼らに電話した) 存在しなかった。
さて、:範囲擬似クラスが導入されました。サポートされているこれは、Edge や IE の [Chrominum 以前] のバージョンではサポートされていませんが、Safari では数年前からサポートされています。これを使用すると、コードは次のようになります。
let myDiv = getElementById("myDiv");
myDiv.querySelectorAll(":scope > .foo");
場合によっては、 をスキップし.querySelectorAll
て他の古き良き DOM API 機能を使用することもできます。たとえば、 の代わりにmyDiv.querySelectorAll(":scope > *")
と記述することもできますmyDiv.children
。
それ以外の場合、まだ に依存できない場合は、カスタム フィルター ロジック (たとえば、の:scope
検索) を追加せずに状況を処理する別の方法は思いつきません。また、任意のセレクター文字列を入力として受け取り、一致リストを出力として受け取るだけのコード パスを 1 つサポートしようとしている場合は、明らかに理想的ではありません。ただし、私のように、単に「ハンマーしか持っていない」と思って行き詰まってこの質問をすることになった場合は、DOM が提供するさまざまな他のツールもあることを忘れないでください。myDiv.getElementsByClassName("foo")
.parentNode === myDiv