无法使用end()在jQuery中从堆栈中弹出集合

时间:2012-10-11 14:30:17

标签: jquery

我注意到.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>

1 个答案:

答案 0 :(得分:2)

重新编辑:

区别在于$m.find(<string selector>)$m.find(<jquery object>);

假设

  • end()函数返回一个名为prevObject的对象(这是jquery堆栈的未记录的公共属性),存储在返回的jquery堆栈中。
  • 此属性是间接设置的,如findfilter
  • 方法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)

并且它有效,因为$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()