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编程语言的编码规范
Oct 21 Javascript
js+css实现增加表单可用性之提示文字
Jun 03 Javascript
JS操作CSS随机改变网页背景实现思路
Mar 10 Javascript
百度地图自定义控件分享
Mar 04 Javascript
JQuery替换DOM节点的方法
Jun 11 Javascript
Sort()函数的多种用法
Mar 20 Javascript
angularjs的select使用及默认选中设置
Apr 08 Javascript
Web安全之XSS攻击与防御小结
Dec 13 Javascript
JS使用数组实现的队列功能示例
Mar 04 Javascript
Vue-CLI 项目在pycharm中配置方法
Aug 30 Javascript
vue.js的状态管理vuex中store的使用详解
Nov 08 Javascript
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
Jun 15 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模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
ThinkPHP自动完成中使用函数与回调方法实例
2014/11/29 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
浅谈window对象的scrollBy()方法
2015/07/15 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
javascript获取select值的方法完整实例
2019/06/20 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
python 获取等间隔的数组实例
2019/07/04 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
电气工程和自动化自荐信范文
2013/12/25 职场文书
工业学校毕业生自荐信范文
2014/01/03 职场文书
医院实习介绍信
2014/01/12 职场文书
自我反省检讨书
2014/01/23 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
学困生帮扶工作总结
2015/08/13 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL