Javascript 如何使jQuery插件尊重end()?
对于大多数更改选择的jQuery函数调用,可以使用返回选择中的一个步骤。例如: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
$('#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非常感谢,这非常有效。我真不敢相信这有多没用。