jquery的追溯

我们都很熟悉jquery中的end()方法就是回到上一级的节点指向如下图: 

jquery的追溯

 

我们会考虑为什么呢,原理是什么?我们接着看下边的例子也许能发现点什么: 

jquery的追溯

 

这里我们会发现其实$(".table").find(".cn-radio") 的属性“prevObject”指向的是 $(".table")。 说到这里我们就要说到我们jquery里栈和追溯源码了。

pushStack: function( elems ) {

 

    // Build a new jQuery matched element set

    var ret = jQuery.merge( this.constructor(), elems );

 

    // Add the old object onto the stack (as a reference)

    ret.prevObject = this;

    ret.context = this.context;

 

    // Return the newly-formed element set

    return ret;

}

 

end: function() {

    return this.prevObject || this.constructor(null);

}

我们会发现通过栈查找的节点都会有一个prevObject属性指向上一个节点的集合, 我们用例子证实一下是不是这样的: 

jquery的追溯

到这里我们是不是都明白了追溯的原理,我们来看一下都哪些方法查找的节点列表可以用追溯的方法

map: function( callback ) {

    return this.pushStack( jQuery.map(this, function( elem, i ) {

        return callback.call( elem, i, elem );

    }));

},

 

slice: function() {

    return this.pushStack( slice.apply( this, arguments ) );

},

 

first: function() {

    return this.eq( 0 );

},

 

last: function() {

    return this.eq( -1 );

},

 

eq: function( i ) {

    var len = this.length,

        j = +i + ( i < 0 ? len : 0 );

    return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );

},