2013-08-04 87 views
3

我有一堆類「.myclass」的元素。現在我想通過它的節點索引選擇這些元素中的一個併爲其設置動畫。我得到一個錯誤,說元素沒有函數動畫。jquery:選擇帶類名和節點索引的元素

例如:

<div class="myclass"></div> 
<div class="myclass"></div> 
<div class="myclass"></div> 

var indizes = [0, 3]; 

$.each(indizes, function(i, v) { 
    $('.myclass')[v].animate({ 
     left: 100 
    }, 1000); 
}); 

顯然,錯誤來自使用了錯誤的選擇。它的工作,如果我使用

$($('.myclass')[v]) 

代替

$('.myclass')[v] 

這是實際的問題?嵌套選擇器似乎很奇怪。

+1

'$()'返回一個jQuery對象。 '[0]'獲取DOM節點。 DOM節點沒有jQuery方法。使用'.eq()'來獲取索引處節點的jQuery對象。 –

+0

:nth-​​child()選擇器可能會有幫助,但不確定它是否是考慮到動態索引值的最佳選擇。 – citykid

回答

3

這是實際的問題嗎?

是的。如果通過括號表示法訪問所選元素,則會返回原始DOM元素。 DOM元素沒有animate方法。通過再次將DOM元素傳遞給jQuery($($('.myclass')[v])),您正在創建一個jQuery對象(再次)。

你能避免這一點,並使用.eq得到一個jQuery對象爲索引處的元素:

$('.myclass').eq(v); 

這將是更好地保持到外循環選定元素的引用,但:

var indizes = [0, 3]; 
var $elements = $('.myclass'); 

$.each(indizes, function(i, v) { 
    $elements.eq(v).animate({ 
     left: 100 
    }, 1000); 
}); 

或者,您可以使用.filter來過濾出你想要建立動畫的元素,其中至少看起來有點更簡潔:

$('.myclass').filter(function(i) { 
    return $.inArray(i, indizes) > -1; 
}).animate({ 
    left: 100 
}, 1000); 
當您使用
+0

太棒了!它完美的作品。非常感謝你。 – Timo

0

$('.myclass')[v]你在指數中得到實際的DOM對象v

,你可以在下面使用的,而不是試圖用一個數組表示法

$('.myclass:eq('+v+')'); 

:eq doc

+0

爲什麼要投票? –

1

你正在做的一切對,是的,你必須像這樣重新包裝元素。

var indizes = [0, 3], 
    elements = $('.myclass'); 

$.each(indizes, function(i, v) { 
    $(elements[v]).animate({ 
     left: 100 
    }, 1000); 
}); 

當你做$('.myclass')[0]那麼元素沒有附帶任何jQuery方法了