2013-04-04 69 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(); 
相關問題