再編集:
違いは$m.find(<string selector>)
と$m.find(<jquery object>);
仮定
- この
end()
関数は、返された jquery スタックに格納された、呼び出されたオブジェクトprevObject
(これは文書化されていない jquery スタックのパブリック プロパティです) を返します。
find
このプロパティは、およびのような関数で間接的に設定されます。filter
- メソッドの動作は、引数の型 (または)
find
によって異なります。string
jquery 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)
要素$m
がdisplay: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()
)