jQuery,接下来,上一个,骑自行车到第一个和最后一个

对不起这个令人困惑的标题。 我想要做的是一个函数(或者只是一个简单的方法),它将执行简单的.next() ,但是如果没有下一个元素,则先匹配。 对于.prev()也一样 – 如果没有前一个元素,则匹配最后一个。 所以我这样做了:

var current_selected = getSelected(); if(current_selected.length) { var prev = current_selected.prev(); if(prev.length) { setSelected(prev); return; } } setSelected(getLast()); 

但我真的不喜欢它,我认为有一些漂亮的方式做到这一点。 有什么想法吗? ( getSelectedgetLast返回jQuery对象。

这适用于prev案例

 var current_selected = getSelected(); var prev = current_selected.prev(); if(prev.length) { setSelected(prev); } else { setSelected(getLast()); } 

你可以创建一些小便利插件:

 $.fn.nextWrap = function() { var $next = this.next(); if ($next.length) return $next; return this.siblings().first(); }; $.fn.prevWrap = function() { var $prev = this.prev(); if ($prev.length) return $prev; return this.siblings().last(); }; 

然后你可以简单地做$('#something').nextWrap()$('#something').prevWrap()

这是一个快速演示: http : //jsfiddle.net/qpDKL/

注意:这将主要表现为prev()next() (当然还有包装行为),但它不支持prev|next(selector)语法。


编辑:这是一个稍微简洁的插件语法,因为它们几乎是相同的:

 $.each(['next', 'prev'], function(i, nextOrPrev) { $.fn[nextOrPrev + 'Wrap'] = function() { var $item = this[nextOrPrev](); if ($item.length) return $item; return this.siblings()[nextOrPrev === 'next' ? 'first' : 'last'](); }; }); 

我能想到的最好的方法是拥有一个你想要循环的元素数组。 您可以通过两种方式遍历数组:

 array.push(array.shift()); 

要么

 var count = 0; function cycle() { return array[count++ % array.length]; } 

我认为前者看起来更干净。

http://jsfiddle.net/ExplosionPIlls/feeF5/

围绕这些线的东西:

 if (!$('selected').next().length) return $('selected').parent().children().first(); else return $('selected').next(); if (!$('selected').prev().length) return $('selected').parent().children().last(); else return $('selected').prev();