0

抱歉这个令人困惑的标题。我想做的是一个函数(或者只是一个简单的方法),它会做简单的.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 对象。

4

4 回答 4

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()or $('#something').prevWrap()

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

注意:这将主要表现得像prev()and 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']();
    };
});
于 2013-04-04T15:17:24.573 回答
1

这将适用于prev案例

var current_selected = getSelected();

var prev = current_selected.prev();
if(prev.length) {
    setSelected(prev);
} else {
    setSelected(getLast());
}
于 2013-04-04T15:16:02.517 回答
0

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

array.push(array.shift());

或者

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

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

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

于 2013-04-04T15:18:07.157 回答
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();
于 2013-04-04T15:21:02.843 回答