2021-06-28 可设置中奖人数的随机不重复抽奖

本文介绍了一个能够设置中奖人数的随机抽奖程序,利用JavaScript动态生成候选人列表,通过定时器实现不重复抽取中奖者,当达到预设的中奖人数时自动停止抽奖。

实现效果

输入中奖人数,点击开始,可以从候选名字中不重复地得到对应数量中奖幸运儿

思路

1.动态创建ul下的li节点并让其文本内容为每个候选名字
2.定时器中随机获取的每个li名字输出到页面
3.当获取的名字数量等于待获取的中奖人数时清除定时器(结束抽奖)

代码
html
<div class="box">
    <input type="text" class="text" placeholder="请输入抽奖人数">
    <ul>
        <!-- <li class="current"></li> -->
    </ul>
    <h1>本期幸运儿是:<span></span></h1>
    <div class="btn">
        <input type="button" value="开始">
        <input type="button" value="停止">
    </div>
</div>
css
*{margin:0;padding:0;}
.box{width: 860px;height: 550px;border:solid #ddd;margin:10px auto;position:relative;}
li{list-style-type: none;float: left;width: 100px;height: 50px;border:solid #ddd;margin:10px;text-align: center;line-height: 50px;}
.btn{position: absolute;left:50%;bottom:20px;transform: translateX(-50%);}
.text{width: 150px;height: 30px;margin:10px;}
.btn>input{width: 80px;height: 40px;margin-right: 20px;}
h1{width: 600px;float: left;font-size: 16px;margin-left: 15px;margin-top: 20px;}
.current{background-color: orangered;}
js
//设置中奖候选人
var array = ["宋江", "卢俊义", "吴用", "公孙胜", "关胜",
    "林冲", "花荣", "武松", "鲁智深", "戴宗",
    "史进", "李逵", "阮小二", "李俊", "燕青",
    "扈三娘", "时迁", "孙二娘", "顾大嫂", "阮小五",
    "阮小七", "雷横", "柴进", "呼延灼", "关胜",
    "高俅", "高太尉", "西门庆", "李师师", "潘金莲"
];

//获取节点
var text = document.querySelector(".text");
var input = document.querySelectorAll(".btn>input");
var span = document.querySelector("span");
var ul = document.querySelector("ul");
var timer = null;

//为每一个中奖候选人动态创建li节点并追加为ul的子节点
for (var i = 0; i < array.length; i++) {
    var li = document.createElement("li");
    li.innerHTML = array[i]; //不能写成li[i].innerHTML:生成的是单个节点
    ul.appendChild(li);
}

//点击开始按钮
input[0].onclick = function() {
        var num = text.value; //输入的中奖人数:文档输入框中输入的数字
        var arr = []; //声明一个空数组,准备去接中奖名字
        var score = 0,count = 0; //统计摇奖跳转次数 统计中奖人数
        clearInterval(timer);
        fn();

        function fn() {
            timer = setInterval(function() {
            	//摇奖
                var random = getNum(0, array.length); //获取一个0-array.length的随机数
                var li_select = document.querySelector(".current"); //current设置了橘色样式
                if (li_select != null) li_select.className = "";
                ul.children[random].className = "current"; //摇奖:每50ms就让橘色框在随机的li之间跳转
                score++; //每50ms自增一次
                
                //每1.5s选出一个中奖者
                if (score == 30) { 
                    var onOff = true;
                    var name = ul.children[random].innerHTML; //提取出中奖者的名字:1.5s时刻橘框停留的li位置
                    //中奖的名字不能再次中奖
                    arr.forEach(function(val) {if (name == val) onOff = false; });
                    
                	//将中奖的名字push进arr数组里,并统计已中奖人数
                    if (onOff) {
                        arr.push(name); 
                        count++;
                    }
                    score = 0; //选好名字后清零,重新累计到下一个30次
                    clearInterval(timer); //选好名字后必须清空定时器
                    timer = setInterval(() => {
                        fn();
                        span.innerHTML = arr; //将中奖名字输出到<span>的文本内容
                        if (count >= num) { //已选出的中奖人数和设置的中奖人数的比较
                            clearInterval(timer);
                            ul.children[random].className = "";
                        }
                    }, 2000);
                }
            }, 50);
        }
    }
//获取随机数
function getNum(min, max) {return Math.round(Math.random() * (max - min) + min);}
效果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端OnTheRun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值