我注意到.end()无法返回旧的jquery元素集,如果我在find()中设置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>
答案 0 :(得分:2)
重新编辑:
区别在于$m.find(<string selector>)
和$m.find(<jquery object>);
end()
函数返回一个名为prevObject
的对象(这是jquery堆栈的未记录的公共属性),存储在返回的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
在第二种情况下:
$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;
}
}
});
}
此调用返回一个堆栈,其中prevObject填充jQuery( selector )
而不是原始堆栈。在您的情况下,prevObject是jquery对象$t
而不是$m
。
我认为这是一个由于无对象地使用jquery库而导致的错误(你的代码没有任何意义,因为你应该简单地编写$t.text('blabla2').show()
)