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()函数返回一个名为prevObject(这是 jquery 堆栈的未记录公共属性)的对象,存储在返回的 jquery 堆栈中。
  • 此属性是在函数中间接设置的,例如findfilter
  • 该方法的find行为取决于参数的类型(stringjquery 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 ).filterselector

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()

于 2012-10-11T14:46:44.847 回答