写了一个抽奖的jquery插件和计算概率的方法, 结合起来就是一个简单的概率抽奖, 不过实际项目中基本不会把抽奖概率的计算放在前端处理~。
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;
}
};