7

ノードのタイプ、クラス、ID、または階層を知らなくても、フラグメントからルート要素を選択できる必要があります。

<div id="0">
    <div id="0a">
        <div id="a01"></div>
    </div>
    <div id="0b">
    </div>
    <div id="0c">
    </div>
</div>

$(':root') のようなことができるようになり、上記の例では 0 が選択されます。

$(':level(0)')上記と同じ意味で、$(':level(1)')0a、0b、および 0c を$(':level(1)>div')選択し、a01 を選択するほうがよいでしょう。

それをきれいに行う方法についてのアイデアはありますか?

4

9 に答える 9

4

jquery を使用して最上位ノードを検索する場合は、次のようにします (取得したサンプルを使用していると仮定して)。

 $('*:not(* *)');  

ここで文字通り求めているのは、他のノードの子ではないすべてのノードです。問題は、html ドキュメントの場合、常に html 要素しか得られず、特に役に立たないことです。したがって、html ドキュメントの本文内で最上位の要素を見つけたい場合は、もっと単純なものを使用します。

 $('body > *');

2 番目のレベルが必要な場合は、次のレベルに進みます。

 $('body > * > *');

しかし、何らかの任意のドキュメント構造 (あなたが言及した foo のようなもの) があると仮定すると、最初の例を使用して最初のレベルを見つけることができます。

 $('*:not(* *)');

そして第2レベルへ

 $('*:not(* *)').find('> *');

そして第3レベルへ

 $('*:not(* *)').find('> * > *');

などなど。ルート div 要素を探している場合 (サンプルが質問のようなものであると仮定して)、次のようにすることができます。

 $('div:not(div div)');

など、* を div に置き換えます。なぜこれをやりたいのかよくわかりませんが、うまくいきます。問題は、質問がより良い代替案を提供するのに十分なコンテキストを実際に提供していないことです.

于 2009-11-04T11:53:09.650 に答える
3

この質問は少し前に完全に正しく回答されましたが、私はこれを自分で試みようとしていただけ*:not(* *)で、主にオーバーヘッドが考えられるため、セレクターの使用にあまり熱心ではありませんでした。これが jQuery の機能(私は 1.8 を使用しています)への最近の追加であるかどうかはわかりませんが、次のものを使用できます。

$(':eq(0)');

これにより、最初に見つかった非 textnode 要素が選択されるため、トラバースしている DOM の形成が違法でない限り、常にルート要素を取得する必要があります。また、jQuery は最初の要素が見つかった後に停止することを認識している必要があるため、非常に最適です。

そこで、WSOD ファンの皆さんにちょっとしたお知らせがあります。

$(':eq(0)').remove();

ああ、念のため、上記のコード スニペットがセレクターを示しているだけであることが明らかではなく、(完全なドキュメントではなく) 部分的なフラグメントで作業していることに気付いた場合は、このセレクターを jQuery のフィルター メソッドで使用する必要があります。

$(fragment).filter(':eq(0)');

ただし、フラグメントを操作する場合は、次の操作を実行できます。

$(fragment).get(0);

ただし.get(0)、ドキュメントの最初のアイテムである場合はテキスト/コメント ノードを選択できますが、フィルター アプローチでは常に最初の実際の要素が検出されます。

于 2012-10-06T12:46:30.157 に答える
2

私はどちらかというとプロトタイプ派ですが、すべてのノードを取得してから配列の最初のノードを取得できると思います。

$('*')[0]

次に、その子アイテムを取得します(0a、0b、および0cの場合)

$('*')[0].children()
于 2009-10-30T14:22:48.213 に答える
2

次のような jQuery フラグメントとして要素を持っている場合:

var myElements = $('<div id="0">
<div id="0a">
    <div id="a01"></div>
</div>
<div id="0b">
</div>
<div id="0c">
</div>
</div>');

次に、次の方法で最初の要素を見つけることができます。

myElements.filter(":first")

フィルター関数は、フラグメントのルート要素から検索します。

于 2013-08-20T02:24:32.170 に答える
1

jQueryは必要ありません...

var root = document.firstChild;
于 2009-10-30T14:23:39.323 に答える
1

私は質問を誤解しているかもしれませんが、ルートによって、親が子とは異なるタグであるポイントを意味すると仮定すると、次のように動作するはずです。

function GetRoot(element) {
    while(element.parent().attr("tagName") == element.attr("tagName")) {
        element = element.parent();
    }

    return element;
}

これは基本的に、別のタグである親が見つかるまでツリーをたどり、アイテムを返します。あなたの例では、要素が 、 、またはそれがルートとして検出され、それを返すものであれば何でも意味します。

これを使用してカスタム jquery セレクターを作成することも可能ですが、明らかにより複雑です。

これを拡張して、レベルを定義する整数を取得するのもかなり簡単です。ルートを見つけたら、指定された深さまでツリーをたどり、それらの要素を返すだけです。

于 2009-11-05T13:18:37.880 に答える
0

要素の最上位の親を選択したいが、本体の下にある場合は、

$(obj).parents().filter('body > *')
于 2013-03-16T12:13:54.973 に答える
0

parent() および children() 関数を使用して調べることができます。複数のレベルに移動する必要がある場合は、そのようにチェーンできます。

$("#a01").parent().parent()  //returns <div id="0">

私のコメントをご覧ください。より良い解決策を提供するよう努めます。

于 2009-10-30T14:23:45.843 に答える
0

ajax 呼び出しから html フラグメントを取得し、そこからルート div も取得する必要があります。私がしたことは、単純に を呼び出すだけ$(data)で、jQuery は返されたテキストを HTML として解析し、ルートを提供します。

$.ajax path,
  type: 'GET'
  contentType: 'application/x-www-form-urlencoded;charset=UTF-8'
  success: (data) ->
    $(data)
于 2012-12-24T07:23:35.637 に答える