Javascript 如何使jQuery插件尊重end()?

Javascript 如何使jQuery插件尊重end()?,javascript,jquery,jquery-plugins,jquery-selectors,Javascript,Jquery,Jquery Plugins,Jquery Selectors,对于大多数更改选择的jQuery函数调用,可以使用返回选择中的一个步骤。例如: $('#myElement').parent().show().end().css('color', '#ff0000'); $.fn.nextBarOne = function(selector) { var ret = this.next().next(); return (typeof selector === 'undefined') ? ret : ret.filter(selector

对于大多数更改选择的jQuery函数调用,可以使用返回选择中的一个步骤。例如:

$('#myElement').parent().show().end().css('color', '#ff0000');
$.fn.nextBarOne = function(selector) {
    var ret = this.next().next();

    return (typeof selector === 'undefined') ? ret : ret.filter(selector);
}
这将显示父元素,然后使原始选择变为红色

然而,当我定义自己的jQuery插件来过滤一个选择时,我没有得到这个功能。例如:

$('#myElement').parent().show().end().css('color', '#ff0000');
$.fn.nextBarOne = function(selector) {
    var ret = this.next().next();

    return (typeof selector === 'undefined') ? ret : ret.filter(selector);
}
如果现在执行
$('#myElement').nextBarOne().show().end()
,则不会返回到原始选择。显然这是因为函数在内部调用
next
两次,然后有时调用
filter


如何定义jQuery插件,使我能够像内置函数一样使用
end

使用
.next()
遍历后设置
prevObject
,以指向原始jQuery对象

$.fn.nextBarOne = function(selector) {
    var self = this,
        ret = (typeof selector === 'undefined') ? 
                this.next().next() : this.next().next().filter(selector);
    ret.prevObject = self; 
    return ret;
}
编辑:

可能使用
pushStack()
进行清洁。我还将选择器包括在
pushStack
调用中

$.fn.nextBarOne = function(selector) {
    var ret = (typeof selector === 'undefined') ? 
                this.next().next() : this.next().next().filter(selector);
    return this.pushStack(ret, "nextBarOne", selector || "");           
}

在jQuery源代码中查找“pushStack”;基本上,您的代码会像jQuery“find”、“parents”等函数那样调用它。它看起来有一个共同的模式——但是现在我想到了它,我在看1.4.4,而不是1.5;我怀疑事情已经改变了though@Russ除非您使用选择器--
过滤器
也清楚地设置了
prevObject
,否则这是可行的。我认为在所有其他操作之后,您需要将
ret.prevObject
行放在后面…@Russ非常感谢,这非常有效。我真不敢相信这有多没用。