Выберите 5 случайных элементов
Как выбрать первые 5 случайных элементов
<ul>
<li>First</li>
<li>Second</li>
<li>Third</li>
...
<li>N</li>
</ul>
Я использую этот плагин:
alert($("li:random").text());
но он принимает все случайные элементы. Мне нужны только первые 5.
Есть ли другой способ сделать то же самое?
Ответы
Ответ 1
Здесь, как получить 5 случайных элементов из выбора jQuery, нет необходимости в плагинах!
randomElements = jQuery("li").get().sort(function(){
return Math.round(Math.random())-0.5
}).slice(0,5)
В этот момент у вас есть 5 DomElements, которые были выбраны случайным образом из всех LI, которые возвратили jQuery
Затем вы можете делать все, что вам нравится,
например, изменить цвет:
$(randomElements).css("color","red")
или отобразить их комбинированное текстовое содержимое:
$(randomElements).text()
Ответ 2
Получить индекс случайных чисел, 1-5, и получить дочерний элемент ul с этим индексом. Например:
var index = Math.floor(Math.random() * 5) + 1; // nth-child indices start at 1
alert($("ul:nth-child(" + index + ")").text());
Ответ 3
Используя Fisher-Yates shuffle, для этой цели я создал небольшой script. Это делается путем создания случайной перетасованной и нарезанной копии массива элементов jQuery, а затем фильтрации всех элементов, которые не существуют в обоих массивах.
Вы можете прочитать об этом на http://www.afekenholm.se/jquery-rand. Здесь script:
/**
* jQuery.rand v1.0
*
* Randomly filters any number of elements from a jQuery set.
*
* MIT License: @link http://www.afekenholm.se/license.txt
*
* @author: Alexander Wallin (http://www.afekenholm.se)
* @version: 1.0
* @url: http://www.afekenholm.se/jquery-rand
*/
(function($){
$.fn.rand = function(k){
var b = this,
n = b.size(),
k = k ? parseInt(k) : 1;
// Special cases
if (k > n) return b.pushStack(b);
else if (k == 1) return b.filter(":eq(" + Math.floor(Math.random()*n) + ")");
// Create a randomized copy of the set of elements,
// using Fisher-Yates sorting
r = b.get();
for (var i = 0; i < n - 1; i++) {
var swap = Math.floor(Math.random() * (n - i)) + i;
r[swap] = r.splice(i, 1, r[swap])[0];
}
r = r.slice(0, k);
// Finally, filter jQuery stack
return b.filter(function(i){
return $.inArray(b.get(i), r) > -1;
});
};
})(jQuery);
Ответ 4
jQuery.jQueryRandom = 0;
jQuery.extend(jQuery.expr[":"], {
random: function(a, i, m, r) {
if (i == 0) {
jQuery.jQueryRandom = Math.floor(Math.random() * r.length);
};
return i == jQuery.jQueryRandom;
}
});
Ответ 5
$("li:lt(5):random").text()
Ответ 6
Почему бы просто не сделать это, кажется довольно эффективным:
jQuery('li:random').slice(0, 5);