「this」のjQueryの最初の子


317

「this」をクリックされたスパンからjQuery関数に渡して、クリックされた要素の最初の子でjQueryを実行できるようにしています。うまくいかないようです...

<p onclick="toggleSection($(this));"><span class="redClass"></span></p>

JavaScript:

function toggleSection(element) {
  element.toggleClass("redClass");
}

要素の:first-childを参照するにはどうすればよいですか?


4
jQueryを使用している場合は、jQueryを使用してイベントハンドラーもバインドしてみませんか?
Vivin Paliath、2010

2
バインドイベントハンドラーは、パフォーマンスヒットを追加するdocument.ready()で初期化する必要があるためです(これはIE6のアプリです)。または別の方法がありますか?
macca1 2010

わからない jQueryを使用したバインディングが標準的な方法です(すでにjQueryを使用している場合)。使用するとどのようなパフォーマンスヒットが発生しますjQuery(document).ready(...)か?
Vivin Paliath、2010

これは、7人以上の開発者がいる大規模なアプリケーションです。私が少し片付けようとする前に、それはもともと4秒以上でした。したがって、必要がない場合は、追加しないようにします:)
macca1

回答:


482

既存のjQueryセットによって提供されるコンテキストにセレクターを適用する場合は、find()関数を試してください。

element.find(">:first-child").toggleClass("redClass");

JørnSchou-Rodeさんは、おそらくコンテキスト要素の最初の直接の子孫、つまり子セレクター(>)を見つけたいだけだと指摘しました。彼はまた、find()と非常によく似ているが、必要なのは階層の1つ深いレベルのみを検索するchildren()関数を使用することもできると指摘しています。

element.children(":first").toggleClass("redClass");

1
ありがとう!完璧に動作します。以下にリストされている他の方法も同様に機能すると思います。
macca1

6
私はfind()すべての子孫を検索し、:first-child親ごとに1つの要素を照合できると思います。したがって、このクエリは複数の要素を返す可能性があります。それとも私は間違っていますか?
–JørnSchou-Rode、2010

19
私はこれが古い質問/回答であることを知っていますが、jQuery 1.8の時点で、セレクターでの親なしの ">"セレクターの使用は廃止されます(たとえば、 ">:firstchild")。私の代わりに使用することをお勧めelement.children(":first-child")またはelement.children().first();
ケビン・Bを

3
@KevinBは明らかに、彼らはすべての後にそれを軽視しないことを決定
オリオン座ゼータ星

1
ここで提案されているように、最善のアプローチは、すべてのアイテムを反復処理して最初のアイテムを選択しないことです。これは悪いでしょう。
vsync 2014年


51

jsperfテストを追加して、最初の子を取得するためのさまざまなアプローチの速度の違いを確認しました(合計1000以上の子)

与えられた、 notif = $('#foo')

jQueryの方法:

  1. $(":first-child", notif) -4,304オペレーション/秒-最速
  2. notif.children(":first") -653 ops / sec-85%遅い
  3. notif.children()[0] -1,416オペレーション/秒-67%遅い

ネイティブの方法:

  1. JavaScriptのネイティブ」ele.firstChild- 4934323の ops /秒(上記のすべてのアプローチはと比較して100%遅いですfirstChild
  2. jQeryからネイティブのDOM ELE:notif[0].firstChild- 4913658の ops /秒

したがって、少なくとも最初の子には、最初の3つのjQueryアプローチはお勧めできません(他の多くの場合もそうでしょう)。jQueryオブジェクトがあり、最初の子を取得する必要がある場合は、配列参照(推奨)を使用してjQueryオブジェクトからネイティブDOM要素を取得するか、を使用します。これにより、通常のJavaScriptの使用と同じ結果が得られます。[0] .get(0)ele.firstChild

すべてのテストはChrome Canaryビルドv15.0.854.0で行われます


20
実際にfirstChildは、jQuery children()またはセレクタークエリと同じ結果は得られません。firstChildめったに望まれないテキストノードを含みます。jQueryのcontents()関数 はそれら含まれますが、含まれchildren()ません。新しいブラウザfirstElementChildは最初の子要素を提供することをサポートしますが、IE <9はそれをサポートしません。したがって、使用するfirstChild場合は、最初の非テキストノードの子を手動で見つける必要があります。
最大

1
$(":first-child", notif)$(":first", notif)予想される動作のためのものである必要があります。前者はすべての最初の子要素の子孫を返します。
Drazen Bjelovuk

18
element.children().first();

すべての子供を見つけて、それらの最初のものを得ます。


1
はるかに簡単な方法で、より効率的です.children(':first')
Gras Double

3
それはどのように効率的ですか?最初の子だけを取得するのではなく、すべての子を取得してから最初の子を取得するようです。
Anthony McGrath

9

やってみました

$(":first-child", element).toggleClass("redClass");

要素を検索のコンテキストとして設定したいと思います。これを行うには、他のjQuery達人がここに飛び込んであなたに捨てるより良い方法があるかもしれません:)


3
element孫がいる場合、これは失敗します
アルニタク2013

4

.firstElementChild可能な場合に使用するプラグインを作成し、必要に応じて個々のノードを繰り返し処理するようにフォールバックしました。

(function ($) {
    var useElementChild = ('firstElementChild' in document.createElement('div'));

    $.fn.firstChild = function () {
        return this.map(function() {
            if (useElementChild) {
                return this.firstElementChild;
            } else {
                var node = this.firstChild;
                while (node) {
                    if (node.type === 1) {
                        break;
                    }
                    node = node.nextSibling;
                }
                return node;
            }
        });
    };
})(jQuery);

純粋なDOMソリューションほど高速ではありませんが、Chrome 24 でのjsperfテストでは、他のjQueryセレクターベースのメソッドよりも数桁高速でした。


1
私はこのプラグインが好きですが、2つの問題があります:1)プラグインスクリプトはdocument.bodyまだ初期化されていないため、ヘッドに含めることができません。少数の子供(たとえば10未満)の$('>:first-child',context)場合、少し高速です。子供の数だけがパフォーマンスに影響し、深さには影響しません。
codefactor 2013年

@codefactorの良い点document.body-それについて調べます。
アルニタク2013年

4

あなたはDOMを使うことができます

$(this).children().first()
// is equivalent to
$(this.firstChild)


1

この最初のようにそれを使用してください "myp"のようにpにタグ付けするクラス名を付けてください

次に、次のコードを使用します

$(document).ready(function() {
    $(".myp").click(function() {
        $(this).children(":first").toggleClass("classname"); // this will access the span.
    })
})

-3

あなたがすぐに最初の子供が欲しいならあなたは必要です

    $(element).first();

あなたの要素からdomの特定の最初の要素が必要な場合は、以下を使用してください

    var spanElement = $(elementId).find(".redClass :first");
    $(spanElement).addClass("yourClassHere");

試してみてください:http : //jsfiddle.net/vgGbc/2/


11
これは間違っelementています-DOMノードの場合、最初の子ではなく$(element).first()と同等$(element)です。
アルニタク2013

1
同意しました。要素がDOMノードの場合$(element).first()は$(element)と同等です。これにより、knockoutJSバインディングで問題が発生しました
drgn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.