1

find() で jQuery 要素を設定すると、.end() が jquery 要素の古いセットを取得できないことに気付きました。

jquery ドキュメントhttp://api.jquery.com/find/によると。jQuery オブジェクトを受け入れる必要があります。バグですか?それとも私が知っておくべきことですか?どうもありがとうございました。

<section>
<div id="myDiv" style="display:none;">
    This is my DIV ... <span id="p-text"></span>
</div>
</section>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script>
window.onload = function(){

var $m = $('#myDiv');
var $t = $('#p-text');

// this will show myDiv
$m.find('#p-text').text('blabla').end().show();

// this will not show myDiv
$m.find($t).text('blabla2').end().show();
}
</script>
4

1 に答える 1

2

再編集:

違いは$m.find(<string selector>)$m.find(<jquery object>);

仮定

  • このend()関数は、返された jquery スタックに格納された、呼び出されたオブジェクトprevObject(これは文書化されていない jquery スタックのパブリック プロパティです) を返します。
  • findこのプロパティは、およびのような関数で間接的に設定されます。filter
  • メソッドの動作は、引数の型 (または)findによって異なります。stringjquery Object

何が起こるのですか

  • 引数が の場合<String selector>、現在の jquery オブジェクトをこのprevObjectプロパティに格納します。
  • 引数が の場合 <jquery object>、RETURNED スタックをこのプロパティに格納します。

確かに:

$m.find('#p-text') // return a stack with element <span> and prevObject = $m
.text('blabla') // change simply the text
.end() // return the stack stored in prevObject (ie $m)
.show(); // show the current stack (ie $m)

要素$mdisplay:none

2 番目のケースでは:

$m.find($t) // return a stack with <span> element BUT the prevObject property is the $t element
.text('blabla2') // again change the text
.end() // return the stack stored in prevObject (IE $t now!!)
.show(); // show the current stack (ie $t)

$t要素は隠し要素の子にすぎないため、機能しません。

なんで?

findメソッドは、jquery オブジェクトのjQuery( selector ).filter場合、メソッドを内部的に使用します。selectorここにソースコードの一部

if ( typeof selector !== "string" ) {
    return jQuery( selector ).filter(function() { // <---- here
        for ( i = 0, l = self.length; i < l; i++ ) {
            if ( jQuery.contains( self[ i ], this ) ) {
                return true;
            }
        }
    });
}

jQuery( selector )この呼び出しは、元のスタックの代わりにprevObject で満たされたスタックを返します。あなたの場合、 prevObject は$tではなく jquery オブジェクトです$m

これはjqueryライブラリのオブジェクトレス使用に起因するバグだと思います(単純に書く必要があるため、コードは意味がありません$t.text('blabla2').show()

于 2012-10-11T14:46:44.847 に答える