2009-11-19 3 views
24

Как я могу выбрать первые 5 случайных элементовВыберите 5 случайных элементов

<ul> 
    <li>First</li> 
    <li>Second</li> 
    <li>Third</li> 
    ... 
    <li>N</li> 
</ul> 

I'm using this plugin:

alert($("li:random").text()); 

но он принимает все случайные элементы. Я хочу только первый 5.

Есть ли другой способ сделать то же самое?

+0

Вы можете обернуть DIV вокруг первых пяти на стороне сервера, а затем использовать Li # первый-пять: случайная ? – Kzqai

+0

Нет, я могу использовать! – AlexC

+0

Я не знаю о jQuery, поддерживающей псевдослучайный псевдоним «: random», как вы добавляете эту функциональность и какова логика кода? – duckyflip

ответ

52

Вот как получить 5 случайных элементов из выбора jQuery, нет необходимости в плагинах!

randomElements = jQuery("li").get().sort(function(){ 
    return Math.round(Math.random())-0.5 
}).slice(0,5) 

На данный момент у вас есть 5 DomElements, которые были выбраны случайным образом из всех LIS, что JQuery вернулся

Вы можете делать все, что вы хотите с ними,
например, изменить их цвет:

$(randomElements).css("color","red") 

или отображения их в сочетании содержание текста:

$(randomElements).text() 
+0

+1, хотя мне любопытно, почему вы правильно написали «случайный» текст правильно и последовательно неправильно в фрагментах кода ... :-) –

+3

Общая идея хорошая, но вы не должны перетасовывать массив такой. Сортировка - это неэффективный способ перетасовки массива, а несогласованное сравнение может вызвать проблемы (даже потенциально вызывающие сортировку на неопределенное время). Лучше использовать Shuffle Fisher-Yates (http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle). –

+6

Это не приведет к сортировке случайным образом. Вот статья об этом (это Objective-C, но не имеет значения) http://cocoawithlove.com/2010/06/sorting-nsmutablearray-with-random.html –

0
$("li:lt(5):random").text() 
+2

Но он всегда берет первые 5 ( – AlexC

8

Получить индекс случайных чисел, 1-5, и получить дочерний элемент ul с этим индексом. Вроде так:

var index = Math.floor(Math.random() * 5) + 1; // nth-child indices start at 1 
alert($("ul:nth-child(" + index + ")").text()); 
+2

Oh , это совершенно неверно. Я прочитал вопрос как запросить один случайный элемент из первой пятерки, а не пять случайных элементов из набора. Мне кажется, мне нужен сон!: D –

+5

Получил здесь поиск именно для такого решения. ответ на неверное прочтение не всегда плох :) – Zlatev

+0

Что сказал @Zlatev. :) – SoreThumb

-1

Почему бы просто не сделать это, кажется довольно эффективным:

jQuery('li:random').slice(0, 5); 
+4

Возможно, потому что у jQuery нет селектора ': random' [больше]? – 2012-10-01 19:53:15

2
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; 
    } 
    }); 
8

Использование Я создал небольшой скрипт для этой цели. Это делается путем создания случайной перетасованной и нарезанной копии массива элементов jQuery, а затем фильтрации всех элементов, которые не существуют в обоих массивах.

Вы можете прочитать об этом на http://www.afekenholm.se/jquery-rand. Вот сценарий:

/** 
* 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); 
Смежные вопросы