jquery 抽奖小程序实现代码


Posted in Javascript onOctober 12, 2016

用jquery实现抽奖小程序

 这些日子,到处都可以看到关于微信小程序的新闻或报到,在博客园中写关于微信小程序的也不少。但是今天我要说的不是微信小程序,而是用简单的jquery写的一个好玩的抽奖小程序。最后介绍了后面关于抽奖小程序的一些后面更新的方向和Math.random的一些小知识。(最终结果保存在:http://runjs.cn/detail/rq3bbhto,点击可查看效果)

下面先看一个简单的抽奖小程序的例子:

html:

<div class="g-lottery-box">
  <div class="g-lottery-img">
    <a class="playbtn" href="javascript:;" title="开始抽奖"></a>
  </div>
</div>

css:

*{margin: 0; padding: 0;}
.g-lottery-box {
  width: 400px;
  height: 400px;
  margin-left: 30px;
  position: relative;
  background: url(images/0.gif) no-repeat;
  margin: 0 auto;
}
    
.g-lottery-box .g-lottery-img {
  width: 340px;
  height: 340px;
  position: relative;
  background: url(images/1.png) no-repeat;
  left: 30px;
  top: 30px;
}
      
.g-lottery-box #clik {
  width: 186px;
  height: 186px;
  position: absolute;
  top: 77px;
  left: 77px;
  background: url(images/2.png) no-repeat;
}

js:

/* 注意引用的顺序
 * <script src="js/jquery-2.1.1.min.js" type="text/javascript" charset="utf-8"></script>  
 * <script src="js/jquery.rotate.min.js" type="text/javascript" charset="utf-8"></script>
 * <script src="js/demo.js" type="text/javascript" charset="utf-8"></script>
 *
 * Creat By foodoir 2010-10-11
 *
 * */

var raNum;
//注意:要将raNum设置为全局变量,容易出错

$(function() {
  $('#clik').click(function() {
    //
    raNum = Math.random()*360;
    $(this).rotate({
      duration:3000,
      angle:0,
      animateTo:raNum+720+360,
      callback:function(){
        A();
      }
    });
  });
});

function A(){
  
  if(0 < raNum && raNum <= 30){
    alert("恭喜您抽到理财金2000元!");
    return;
  }else if(30 < raNum && raNum <= 90){
    alert("谢谢参与~再来一次吧~");
    return;
  }else if(90 < raNum && raNum <= 150){
    alert("恭喜您抽到理财金5200元!");
    return;
  }else if(150 < raNum && raNum <= 210){
    alert("恭喜您获得100元京东E卡,将在次日以短信形式下发到您的手机上,请注意查收!");
    return;
  }else if(210 < raNum && raNum <= 270){
    alert("谢谢参与~再来一次吧~");
    return;
  }else if(270 < raNum && raNum <= 330){
    alert("恭喜您抽到理财金1000元!");
    return;
  }else if(330 < raNum && raNum <= 360){
    alert("恭喜您抽到理财金2000元!");
    return;
  }
}

关于小程序的一些思考:

思考一:在A()方法中用了很多if…else,让代码看上去不是那么的优美,有没有什么办法可以让代码看上去又没一点?

解决思路:用switch方法

switch(data) {
  case 1:
    rotateFunc(1, 0, '恭喜您获得2000元理财金!');
    break;
  case 2:
    rotateFunc(2, 60, '谢谢参与~再来一次吧~');
    break;
  case 3:
    rotateFunc(3, 120, '恭喜您获得5200元理财金!');
    break;
  case 4:
    rotateFunc(4, 180, '恭喜您获得100元京东E卡,将在次日以短信形式下发到您的手机上,请注意查收!');
    break;
  case 5:
    rotateFunc(5, 240, '谢谢参与~再来一次吧~');
    break;
  case 6:
    rotateFunc(6, 300, '恭喜您获得1000元理财金!');
    break;
}

//后面还需要定义函数rotateFunc,在这里直接使用另外一种方法来完成
var rotateFunc = function(awards, angle, text) {
  isture = true;
  $btn.stopRotate();
  $btn.rotate({
    angle: 0,
    duration: 4000, //旋转时间
    animateTo: angle + 1440, //让它根据得出来的结果加上1440度旋转
    callback: function() {
      isture = false; // 标志为 执行完毕
      alert(text);
    }
  });
};

思考二:实际中的大转盘可以转好几圈,而此时的效果转了不到一圈,我想要看到转几圈的效果怎么办?

解决思路:animateTo:raNum在这后面加上360乘以想要转的圈数的结果,(以抽奖三次为例)

animateTo:raNum+360*3 

思考三:我们可不可以对抽奖次数进行限制?

解决思路:(以抽奖三次为例)

$(function() {
  var i =0;
  $('#clik').click(function() {
    i++;
    if(i>3){
      alert("您的抽奖机会已经用完!");
    }
    //代码省略
  });
});

思考四:按照前面的思路,按理说每次抽奖能中的概率为1/3,但是我们在实际中并不是那么的想让用户抽中,我们该怎么办?

解决思路:1、我们直接改变raNum,(假如不想让用户获得e卡)

raNum = Math.random()*360;
if(150 < raNum && raNum <= 210){
  raNum += 60;
}

2、我们修改判断条件

else if(150 < raNum && raNum <= 210){
    //再将概率减小到1%
    var n = Math.random()*100;
    if(n<1){
      alert("恭喜您获得100元京东E卡,将在次日以短信形式下发到您的手机上,请注意查收!");
    }else{
      raNum += 60;
    }
    return;
  }
 

思考五:对于抽奖剩余次数,我们可不可以提醒用户?

解决思路:创建一个新的变量,然后通过DOM方法显示出来

<h3>欢迎来到foodoir抽奖小程序,您还有<span id="ii">3</span>次抽奖机会</h3>

h3{
  text-align: center;
  font-family: "微软雅黑", "microsoft yahei";
  line-height: 60px;
}
h3 span{
  font-size: 40px;
  line-height: 60px;
  font-family: elephant;
  display: inline-block;
  padding: 5px 20px;
  border: 2px solid red;
  border-radius: 10px;
  color: #f00;
  background-color: yellow;
}

var ii = 3-i;
if(ii>=0){
  $('#ii').html(ii);

}

思考六:在我们玩扣扣游戏时,经常会看到有滚动屏提示刚刚有谁谁抽到了奖,我们该如何实现?

解决思路:这个需要我们在后台调数据,但是我们可以先自己设置数据并查看效果,我们还可以用Javascript中的Date

<div class="mar">
<marquee><span id="time"></span>恭喜foodoir抽到京东e卡!!!!</marquee>
</div>

var now =new Date();
var hours = now.getHours();
var minutes = now.getMinutes();
var seconds = now.getSeconds();
var t = hours+":"+minutes+":"+seconds;
$('#time').html(t);

到这里,我们的小程序的效果就成这样了:

jquery 抽奖小程序实现代码

点击链接查看效果:http://runjs.cn/detail/rq3bbhto

更多思考--》我们还可以将改程序更完善。

1、在现有页面中增加抽奖榜,将抽到奖的用户和抽到奖的时间显示出来,并且能够自动刷新(AJAX技术实现)

2、增加登录和注册功能,注册成功并登录后方可进行抽奖活动

3、对于抽到的奖,我们可以设置其链接点击后可以进行到该奖可以使用的界面

4、……

或者说我们这样--》

1、在现有页面中增加抽奖榜,将抽到奖的用户和抽到奖的时间显示出来,并且能够自动刷新

2、抽到奖后,我们可以领取奖励,前提是老用户登陆后可以领取,而新用户需要注册后才能领取,并且新用户注册后还送三次抽奖机会。

3、登录完成后进入一个积分商城,有几个排行榜(财富榜和兑换榜)还有可以兑换的等价替换物

4、……

更多关于Math.random的小知识

关于Math.random()

ECMAScript 规范是这样描述 Math.random() 的:“返回一个整数,该整数的取值范围大于等于 0 而小于 1,浏览器开发商使用自定义的算法或策略从该范围内实现均匀分布的随机或伪随机效果。”

显然,规范中遗漏了大量的细节。首先,它没有定义精度。由于 ECMAScript 使用 IEEE 754 双精度浮点数存储所有数值,所以理论上应该有 53 位的精确度,即随机数的随机范围是 [1/x^53, 2^53-1],但实际上,V8 中的 Math.random() 只有 32 位精度,不过这已经足够我们用的了。

真正的问题是规范放任浏览器开发者自由实现该方法,且没有限制最小的周期长度,唯一对分布的要求也只是“近似均匀”。

关于8 PRNG()

var MAX_RAND = Math.pow(2, 32);
var state = [seed(), seed()];
var mwc1616 = function mwc1616() {
  var r0 = (18030 * (state[0] & 0xFFFF)) + (state[0] >>> 16) | 0;
  var r1 = (36969 * (state[1] & 0xFFFF)) + (state[1] >>> 16) | 0;
  state = [r0, r1];
 
  var x = ((r0 << 16) + (r1 & 0xFFFF)) | 0;
  if (x < 0) {
    x = x + MAX_RAND;
  }
  return x / MAX_RAND;
}

上述代码就是 V8 PRNG 的核心逻辑。在老版本的 V8 源码中对此有一段注释:“随机数生成器使用了 George Marsaglia 的 MWC 算法。”根据这段注释,我从谷歌搜索到了以下信息:

George Marsaglia 是一个毕生致力于 PRNG 的数学家,他还开发了用于测试随机数生成质量的工具Diehard tests
MWC(multiply-with-carry)是由 Marsaglia 发明的 PRNG 算法,非常类似于 LCG(linear congruential generators,线性同余法),其优势在于生成的循环周期更长,接近于 CPU 的循环周期。

不过,V8 PRNG 与经典的 MWC 生成器并不相同,因为它不是对 MWC 生成器的简单扩展,而是组合使用了两个 MWC 子生成器(r0 和 r1),并最终拼接成一个随机数。这里略过相关的数学计算,只说结论,每个子生成器最长的循环周期长度都是 2^30,合并后为 2^60。

前面提到过,我们定义的标识符有 2^132 种可能性,所以 V8 的 Math.random() 并不能满足这一需求。尽管如此,我们仍使用该函数并假设生成的随机数是均匀分布的,那么生成一亿个标识符后出现碰撞的可能性才只有 0.4%,但现在发生碰撞的时间也太早了,所以我们的分析一定有什么地方出错了。之前已经证明循环周期长度是正确的,那么很有可能生成的随机数不是均匀分布的,一定有其他的结构影响了生成的序列。

       感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
javascript学习笔记(十二) RegExp类型介绍
Jun 20 Javascript
实现js保留小数点后N位的代码
Nov 13 Javascript
js检测判断日期大于多少天的方法
May 04 Javascript
Bootstrap精简教程
Nov 27 Javascript
基于javascript实现九九乘法表
Mar 27 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
Aug 08 jQuery
vue与TypeScript集成配置最简教程(推荐)
Oct 17 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
Aug 21 Javascript
js实现随机点名程序
Sep 17 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
Feb 02 Javascript
react+antd 递归实现树状目录操作
Nov 02 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
Nov 07 Javascript
微信js-sdk地理位置接口用法示例
Oct 12 #Javascript
vue.js表格组件开发的实例详解
Oct 12 #Javascript
JavaScript实现页面定时刷新(定时器,meta)
Oct 12 #Javascript
基于Javascript实现文件实时加载进度的方法
Oct 12 #Javascript
Vue.js中数组变动的检测详解
Oct 12 #Javascript
有关文件上传 非ajax提交 得到后台数据问题
Oct 12 #Javascript
jquery动态创建div与input的实例代码
Oct 12 #Javascript
You might like
php curl选项列表(超详细)
2013/07/01 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
微信小程序 登录实例详解
2017/01/16 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
2019/02/21 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
python中文件变化监控示例(watchdog)
2017/10/16 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
Python 使用PyQt5 完成选择文件或目录的对话框方法
2019/06/27 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
县优秀教师事迹材料
2014/01/31 职场文书
安全教育主题班会教案
2015/08/12 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
mysql序号rownum行号实现方式
2022/12/24 MySQL