重新编辑:
区别在于$m.find(<string selector>)
和$m.find(<jquery object>);
假设
- 该
end()
函数返回一个名为prevObject
(这是 jquery 堆栈的未记录公共属性)的对象,存储在返回的 jquery 堆栈中。
- 此属性是在函数中间接设置的,例如
find
和filter
- 该方法的
find
行为取决于参数的类型(string
或jquery Object
)
发生什么了
- 如果参数是,
<String selector>
则它将当前 jquery 对象存储在此prevObject
属性中。
- 如果参数是
<jquery object>
然后将返回的堆栈存储在此属性中。
确实:
$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
元素只是隐藏元素的子元素。
为什么?
如果是 jquery 对象,则该find
方法在内部使用该方法。这里是一段源代码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()
)