Choisir 5 éléments aléatoires

Comment puis-je sélectionner les 5 premiers éléments aléatoires

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

j'utilise ce plugin:

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

mais il prend tous les éléments aléatoires. Je ne veux que les 5 premiers.

Est-il une autre façon de faire la même chose?

24
demandé sur AlexC 2009-11-19 18:37:48
la source

6 ответов

Voici comment obtenir 5 éléments aléatoires à partir d'une sélection jQuery, pas besoin de plugins!

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

a ce point vous avez 5 DomElements qui ont été choisis au hasard parmi tous les LIs que jQuery a retournés

Vous pouvez ensuite faire ce que vous voulez avec eux,

e.g changer leur couleur:

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

ou afficher leurs combinés texte contenu:

$(randomElements).text()
52
répondu duckyflip 2009-11-19 20:23:25
la source

shuffle de Fisher-Yates j'ai créé un petit script pour cette fin. Cela se fait d'abord en créant une copie mélangée et découpée au hasard du tableau d'éléments jQuery, puis en filtrant tous les éléments qui n'existent pas dans les deux tableaux.

Vous pouvez lire à ce sujet à http://www.afekenholm.se/jquery-rand. Voici le 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);
8
répondu Alexander Wallin 2011-01-24 22:50:29
la source

Obtenir un nombre aléatoire index, 1-5, et demandez à l'enfant de l'ul avec cet indice. Comme ceci:

var index = Math.floor(Math.random() * 5) + 1;  // nth-child indices start at 1
alert($("ul:nth-child(" + index + ")").text());
8
répondu Frank DeRosa 2011-12-02 05:22:16
la source
  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;
    }
  });
2
répondu Maxim Borzov 2010-11-11 17:57:15
la source
$("li:lt(5):random").text()
0
répondu Nikolas Stephan 2009-11-19 18:55:40
la source

Pourquoi ne pas faire cela, il semble assez efficace:

jQuery('li:random').slice(0, 5);
-1
répondu Gregory Magarshak 2011-12-26 14:40:13
la source

Autres questions sur