6

http://jsfiddle.net/garnwraly/sfrwU/2/

指定された HTML のみ

<li>
    <button id="bam">click</button>
</li>

そしてこのスクリプト

$('body').on('click', 'button', function (e) {
    //console.log( e.currentTarget == $('button')[0] ); //true;
    //console.log($('li').is('li:first')); //true

    console.log($(e.currentTarget).parent().is('li:first')) //false
    console.log($('button').parent().is('li:first')); //true
    console.log($($('button')[0]).parent().is('li:first')); //false
});

なぜ$(e.currentTarget).parent().is('li:first')偽ですか?

4

2 に答える 2

4

jQuery()これが実行されたときに jQuery コードを介してステップ デバッグを行った後、これはメソッド内でのメソッドの使用方法に問題があることが判明しましたis()。ご存知のように、メソッドにコンテキストを渡すことができます。内部的に、このコンテキストはis()メソッドで使用されています (さまざまなセレクターに対して異なる設定が行われています)。

を使用する$(e.currentTarget)と、イベントをトリガーしたボタンにコンテキストが設定されます。when$('button')が使用されている間、コンテキストはDocumentオブジェクトに設定されます。これらのセレクターをどのようにスコープする必要があるかを考えると、これは理にかなっています。

is()メソッドの関連部分は次のとおりです。

jQuery( selector, this.context ).index( this[0] ) >= 0

それに基づいて、$(e.currentTarget) として実行すると、jQuery()メソッドの呼び出しは次のように評価されます。

jQuery("li:first", "button#bam").index( this[0] ) >= 0

明らかに-1を返し、次のように報告していますfalse

于 2013-04-20T02:17:37.620 に答える
3

jQueryオブジェクトがDOM要素から構築されている場合、セレクターのマッチングは行われませ:firstご了承ください

console.log($(document.getElementById('bam')).is(':first'));

も記録しfalseます。

動作が正しいとは思いませんし、おそらくバグがログに記録されるはずですが、正しく機能したとしても、この場合、テスト:firstが実際に何の役にも立たないと思います。.parent()単一の要素から開始して DOM を親ノードに移動するために使用する場合、親が最初の要素であるかどうかを尋ねるのは無意味です。一つだけです。

:first-child実際には興味深いが、必ずしも関連性があるとは限らない でそれを行うと、:first-childは実際には DOM の構造に関するものであるため、期待どおりに機能します。:first修飾子は、最初に一致した要素になるだけです。

于 2013-04-20T00:48:50.107 に答える