2013-04-04 67 views
0

对不起,这个令人困惑的标题。 我想要做的是一个功能(或简单的方法),它会做简单的.next(),但如果没有下一个元素,首先匹配。 .prev() - 如果没有以前的元素,则匹配最后一个。 所以我做这样说: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的对象

+1

哪里是'next' – 2013-04-04 15:13:43

回答

1

这将为prev情况

var current_selected = getSelected(); 

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

我选择了这个,因为我需要这个功能只有一次。如果有人更需要这个,下一个答案会更好。 – UnstableFractal 2013-04-04 15:51:52

5

的工作,你可以创建一些小便利的插件:

$.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'](); 
    }; 
}); 
0

,我能想到的最好的办法是有元素的数组你想循环。您可通过数组方式有两种循环:

array.push(array.shift()); 

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

我认为前者看起来比较清爽。

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

0

周围的东西这些行:

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(); 
相关问题