写了一个抽奖的jquery插件和计算概率的方法, 结合起来就是一个简单的概率抽奖, 不过实际项目中基本不会把抽奖概率的计算放在前端处理~。
demo
lottery.jquery.js
$.fn.extend({lottery: function(conf) { var def = { lotIndex: 0, // 抽中的索引 item: "li", onClass: "on", speedStart: 50, // 初始速度 speedEnd: 400, // 结束速度 speedType: "", // 默认匀速 可选 change: 减速 overTime: 5000, // 抽奖时长(最短) overCallback: function() {} // 抽奖结束后的回调函数}; if (typeof conf.lotIndex === "undefined") { return }def = $.extend({}, def, conf);var $lotteryList = $(this), lotteryControl = {}; lotteryControl = { $el: $lotteryList, item: def.item, itemLen: 0, index: 0, speedType: def.speedType, speedStart: def.speedStart, speed: def.speedStart, speedEnd: def.speedEnd, a: 0, // 加速度 nowTime: 0, // 抽奖已进行时间 overFlag: false, // 抽奖是否结束 onClass: def.onClass, lotIndex: def.lotIndex, overTime: def.overTime, overCallback: def.overCallback, init: function() { this.$items = this.$el.find(this.item); this.itemLen = this.$items.length; this.a = (this.speedEnd - this.speed) / this.overTime; if (this.lotIndex >= this.itemLen) { this.error(); } else { this.start(); } }, start: function() { var self = this; this.play(); this.setStop(); switch (this.speedType) { case "change": this.changeSpeed(); break; } }, play: function() { var $items = this.$items; $items.eq(this.index - 1).removeClass(this.onClass); $items.eq(this.index).addClass(this.onClass); if (this.overFlag && this.index === this.lotIndex) { this.stop(); } else { this.next(); } }, next: function() { var self = this; this.index++; this.index = this.index === this.itemLen ? 0 : this.index; setTimeout(function() { self.play(); }, this.speed); }, changeSpeed: function() { var self = this; setTimeout(function() { self.nowTime += self.speed; if (!self.overFlag) { self.speed = self.speedStart + self.a * self.nowTime; self.changeSpeed(); } }, this.speed); }, setStop: function() { var self = this; setTimeout(function() { self.overFlag = true; }, this.overTime); }, stop: function() { this.overCallback(); }, error: function() { console.log("error......."); }};lotteryControl.init( );return this;}});
概率计算
function PRobability(conf) {this.probArr = conf || [];this.range = [],this.len = this.probArr.length;if (this.len > 0) { this.init();}}Probability.prototype = {init: function() {this.setRange();},get: function() { var len = this.len,range = this.range,last,randNum, i = 0; if (len === 0) {return;} else if(len === 1) {return 0;} last = range[len -1];randNum = Math.floor(last* Math.random()); for (; i < len; i++) { if (randNum < range[i]) {break;}} return i;}, setRange: function() {var range = [],probArr = this.probArr,i = 0,len = probArr.length; for(; i<len; i++) {var now = probArr[i],last = range[i-1] || 0; range.push(now+last);} this.range = range;}};
新闻热点
疑难解答