2013-08-29 102 views
9

如果$('.my-element')匹配多個元素,是否有快速的方法從這些元素中獲取一個隨機元素?

+0

是的,就像你從數組中得到一個隨機值一樣。 –

回答

26
$.fn.random = function() { 
    return this.eq(Math.floor(Math.random() * this.length)); 
}   

$(selector).random(); 
+2

如果插件不存在,請創建一個。 :) – htxryan

+2

這一個比我好。 – DeeDee

+1

我注意到一個奇怪的行爲。如果選擇器僅匹配2個元素,則由於在floor()上四捨五入,您的答案會傾向於(我認爲)總是返回第一個元素。只有我嗎? –

1
var numElements = $('.my-element').length; 
var randomNum = Math.floor(Math.random()*numElements); 
//Select your random element 
$('.my-element:nth-child(' + randomNum + ')'); 
+2

這不會完全工作,因爲[nth-child()選擇器是基於1的](http://api.jquery.com/nth-child-selector/),而您創建的隨機例程是基於0的。人們經常會錯過這一點,因爲在編程中很少見到基於1的東西。如果有4個項目,你的例程永遠不會選擇第4個項目。 – Volomike

2

爲了得到均勻分佈,就可以乘上陣列隨機數,並與位運算符下降小數。

var arr = ['a','b','c']; 
arr[~~(Math.random() * arr.length)]; //even odds of a, b, or c 
+0

~~似乎給出了與Math.floor() – xtian

+0

相同的結果它們具有相同的輸出,但是~~計算速度更快,尤其是在較舊的瀏覽器中。這裏有一篇比較他們的文章:http://rocha.la/JavaScript-bitwise-operators-in-practice – myrcutio