3

我有“selectElement”类的元素。当我单击该类的元素时,我“选择”它,并给它另一个类“selectedElements”,如果它还没有的话。

但是,我有一个按钮,它应该随机选择一定数量(例如 10 个)具有“selectElement”类的元素并给它们“selectedElement”类。

我在这个答案中尝试过类似的东西 - > https://stackoverflow.com/a/1764629/1011539,但它每次都返回相同的值......

编辑:在乔恩的帮助下解决。这是其他有类似问题的用户的代码:)

$("#chooseElementsRand").live("click",function(){
    $(".selectedElements").removeClass("selectedElements");
    var maxNum = parseInt($(".maxNum").html());
    var randomElements = shuffle($(".selectElement")).slice(0,maxNum).addClass("selectedElements");
    $(".selectedNum").html(randomElements.length);
    if(randomElements.length==maxNum) {
        $(".buttonToProceed").removeClass("notShown");
    }
});
4

3 回答 3

17

每当您想从 X 中真正随机选择 N 个元素时,解决方案就是Fisher-Yates shuffle这个页面有一个 Javascript 实现(加上基本原理,加上漂亮的动画,所以去看看):

function shuffle(array) {
  var m = array.length, t, i;

  // While there remain elements to shuffle…
  while (m) {

    // Pick a remaining element…
    i = Math.floor(Math.random() * m--);

    // And swap it with the current element.
    t = array[m];
    array[m] = array[i];
    array[i] = t;
  }

  return array;
}

给定随机播放,然后您可以随机选择 X 个元素

var items = shuffle($(".selectElement")).slice(0, X);

这是一个可以玩的小提琴。

脚注:由于您只对一定数量的随机选择感兴趣,因此无需像shuffle上面那样无条件地打乱整个输入数组;你可以只洗牌一小部分,然后用.slice它来切断它并使用它。我将把它留作练习;小心不要误抓 *un*shuffled 部分!

于 2012-06-25T09:36:01.743 回答
6

您可以使用 jquery 方法按类名选择随机项eq()

见下面的例子。

var len = $(".someClass").length;
var random = Math.floor( Math.random() * len ) + 1;
$(".someClass").eq(random).css("background-color", "yellow");
于 2015-12-24T05:45:30.240 回答
3

像这样的东西会起作用(通过点击一个元素来触发它)

$(".selectElement").on("click", function() {
    var randomElements = $(".selectElement").get().sort(function() {
        return Math.round(Math.random()) - 0.5;
    }).slice(0, 5);
    $(randomElements).css('border', '1px solid red');
});​

http://jsfiddle.net/rKFfm/

于 2012-06-25T09:36:29.193 回答