2010-09-17 66 views
2

我需要根據使用:eq()(或別的東西,如果你有一個更好的解決方案)有指數選擇的jQuery元素的特定農莊選擇一定範圍的DOM元素的基於指數

我的HTML結構如下:

<ul> 
    <li>slide0</li> 
    <li>slide1</li> 
    <li>slide2</li> 
    <li>slide3</li> 
    <li>slide4</li> 
</ul> 

當用戶將鼠標懸停在滑件,我需要選擇li:eq(0), li:eq(1)li:eq(3), li:eq(4) separatly,因爲他們有不同的動畫幻燈片。

這是我的解決方案,但這種感覺有點凌亂...

var $slides, theOthers, slidesTotal; 
$slides = $('ul > li'); 
slidesTotal = $slides.length; 
theOthers = function(slideIndex ,slidesTotal){ 
    var before = [], after = [], i=0; 
    while (i<=slideIndex - 1){ 
     before[i] = ":eq(" + i + ")" 
     i++ 
    }; 
    while (i <= slidesTotal) { 
     after[i] = ":eq(" + i + ")" 
     i++ 
    }; 
    return [ before.join(",") , after.join(",") ] 
} 

$slides.mouseenter(function(){ 
    var groups, slideIndex, $that = $(this); 
    slideIndex = $that.index(); 
    groups = theOthers(slideIndex, slidesTotal); 
    $slides.filter(groups[0]).dosomething(); 
    $slides.filter(groups[1]).dosomethingelse() 
}) 

有沒有更簡單的方法使用jQuery做到這一點?

+0

對不起之前,我誤解你的問題。刪除我的答案:-) – 2010-09-17 09:47:46

+0

沒問題,這是一個有趣的選擇組合:P,但我已經使用了'$ slides.not($(this))'等等......然後發現我需要動畫元素 – meo 2010-09-17 09:52:17

回答

6

使用.prevAll().nextAll()您可以向下降低代碼的所有的問題是:

$('ul > li').mouseenter(function() { 
    $(this).prevAll().dosomething(); 
    $(this).nextAll().dosomethingelse(); 
}); 

.prevAll()得到所有以前的兄弟姐妹和.nextAll()得到所有下面的兄弟姐妹,你可以做你想做的到每一組。

+0

這正是我要找的謝謝 – meo 2010-09-17 09:41:59

+0

@meo - 歡迎:) – 2010-09-17 09:42:54

0
jQuery('someElm ~ .someClass') 

比賽的所有元素.someClass任何兄弟姐妹seomeElm

+0

如何將這個應用於我的例子? – meo 2010-09-17 09:43:45

+0

尼克的答案:我認爲將解決你的問題。 – 2010-09-17 09:45:50

+0

我知道,但我想知道你的問題適合我的問題。 – meo 2010-09-17 09:46:43