一个跑马灯式的抽奖(转盘)活动
先看下效果:
由于写javascript和jquery的代码不多,加之活动时间要求比较紧,就在网络上寻找了下相关效果,大概是这样的:
引用自:www.cnblogs.com/caism/archive/2011/10/12/2208738.html
效果:http://www.csrcode.cn/html/txdm/qtdm/3876.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>js抽奖</title> <style type="text/css"> td{width:50px;height:50px;border:3px solid #ccc;text-align:center;vertical-align:middle} </style> </head> <body> <table id="tb"> <tr> <td>1</td><td>2</td><td>3</td><td>4</td><td>5</td> </tr> <tr> <td>16</td><td></td><td></td><td></td><td>6</td> </tr> <tr> <td>15</td><td></td><td></td><td></td><td>7</td> </tr> <tr> <td>14</td><td></td><td></td><td></td><td>8</td> </tr> <tr> <td>13</td><td>12</td><td>11</td><td>10</td><td>9</td> </tr> </table> <p></p> 请输入1-16其中一位整数,代表要停止的位置<input id="txtnum" value="12" type="text" /><input type="button" value="开始" onclick="StartGame()" /> <script type="text/javascript"> /* * 删除左右两端的空格 */ function Trim(str){ return str.replace(/(^\s*)|(\s*$)/g, ""); } /* * 定义数组 */ function GetSide(m,n){ //初始化数组 var arr = []; for(var i=0;i<m;i++){ arr.push([]); for(var j=0;j<n;j++){ arr[i][j]=i*n+j; } } //获取数组最外圈 var resultArr=[]; var tempX=0, tempY=0, direction="Along", count=0; while(tempX>=0 && tempX<n && tempY>=0 && tempY<m && count<m*n) { count++; resultArr.push([tempY,tempX]); if(direction=="Along"){ if(tempX==n-1) tempY++; else tempX++; if(tempX==n-1&&tempY==m-1) direction="Inverse" } else{ if(tempX==0) tempY--; else tempX--; if(tempX==0&&tempY==0) break; } } return resultArr; } var index=0, //当前亮区位置 prevIndex=0, //前一位置 Speed=300, //初始速度 Time, //定义对象 arr = GetSide(5,5), //初始化数组 EndIndex=0, //决定在哪一格变慢 tb = document.getElementById("tb"), //获取tb对象 cycle=0, //转动圈数 EndCycle=0, //计算圈数 flag=false, //结束转动标志 quick=0; //加速 function StartGame(){ cycle=0; flag=false; EndIndex=Math.floor(Math.random()*16); //EndCycle=Math.floor(Math.random()*4); EndCycle=1; Time = setInterval(Star,Speed); } function Star(num){ //跑马灯变速 if(flag==false){ //走五格开始加速 if(quick==5){ clearInterval(Time); Speed=50; Time=setInterval(Star,Speed); } //跑N圈减速 if(cycle==EndCycle+1 && index==EndIndex){ clearInterval(Time); Speed=300; flag=true; //触发结束 Time=setInterval(Star,Speed); } } if(index>=arr.length){ index=0; cycle++; } //结束转动并选中号码 if(flag==true && index==parseInt(Trim(document.getElementById("txtnum").value))-1){ quick=0; clearInterval(Time); } tb.rows[arr[index][0]].cells[arr[index][1]].style.border="3px solid red"; if(index>0) prevIndex=index-1; else{ prevIndex=arr.length-1; } tb.rows[arr[prevIndex][0]].cells[arr[prevIndex][1]].style.border="3px solid #ccc"; index++; quick++; } /* window.onload=function(){ Time = setInterval(Star,Speed); } */ </script> </body> </html>
由于上面的代码是前端控制中奖奖项,我通过ajax从后端获取奖项并记录数据。于是改了下js代码。虽然简单,写点代码备注下:
<script type="text/javascript">
/*
* 删除左右两端的空格
*/
function Trim(str){
return str.replace(/(^\s*)|(\s*$)/g, "");
}
/*
* 定义数组
*/
function GetSide(m,n){
//初始化数组
var arr = [];
for(var i=0;i<m;i++){
arr.push([]);
for(var j=0;j<n;j++){
arr[i][j]=i*n+j;
}
}
//获取数组最外圈
var resultArr=[];
var tempX=0,
tempY=0,
direction="Along",
count=0;
while(tempX>=0 && tempX<n && tempY>=0 && tempY<m && count<m*n)
{
count++;
resultArr.push([tempY,tempX]);
if(direction=="Along"){
if(tempX==n-1)
tempY++;
else
tempX++;
if(tempX==n-1&&tempY==m-1)
direction="Inverse"
}
else{
if(tempX==0)
tempY--;
else
tempX--;
if(tempX==0&&tempY==0)
break;
}
}
return resultArr;
}
var index=0, //当前亮区位置
prevIndex=0, //前一位置
Speed=300, //初始速度
Time, //定义对象
arr = GetSide(3,4), //初始化数组
EndIndex=0, //决定在哪一格变慢
tb = document.getElementById("tb"), //获取tb对象
cycle=0, //转动圈数
EndCycle=0, //计算圈数
flag=false, //结束转动标志
quick=0; //加速
btn = document.getElementById("btn1")
hit_info; //中奖名称
function StartGame(){
clearInterval(Time);
cycle=0;
flag=false;
//EndCycle=2;
EndCycle=Math.floor(Math.random()*2+2);
$.ajax({
url:'index.php?act=huodong_2015yurenjie&op=getdata&lottery_id=1',
type:'post',
//data:'hash="<?php echo $output['hash'];?>"&sid=<?php echo session_id();?>',
data:{
'hash' : '<?php echo $output['hash'];?>',
'sid' : '<?php echo session_id();?>'
},
// cache:false,
dataType:'json',
async : false, //默认为true 异步
error:function(){
alert('获取失败,请稍后重试');
},
success:function(data){
//alert(data);
if(data['error']==1){
alert(data['message']);
}else{
info=data['data'];
EndIndex=info['hit_pos'];
hit_info=info['hit_info'];
Time = setInterval(Star,Speed);
}
}
});
// alert(EndIndex);
}
function Star(num){
//跑马灯变速
if(flag==false){
//走五格开始加速
if(quick==5){
clearInterval(Time);
Speed=50;
Time=setInterval(Star,Speed);
}
//跑N圈减速
if(cycle==EndCycle+1 && index==parseInt(EndIndex)){
//alert(parseInt(EndIndex));
clearInterval(Time);
Speed=300;
flag=true; //触发结束
Time=setInterval(Star,Speed);
}
}
if(index>=arr.length){
index=0;
cycle++;
}
//结束转动并选中号码
//trim里改成数字就可以减速,变成Endindex的话就没有减速效果了
//if(flag==true && index==parseInt(Trim('5'))-1){
if(flag==true && index==EndIndex-1){
quick=0;
clearInterval(Time);
}
tb.rows[arr[index][0]].cells[arr[index][1]].className="playcurr";
if(index>0)
prevIndex=index-1;
else{
prevIndex=arr.length-1;
}
tb.rows[arr[prevIndex][0]].cells[arr[prevIndex][1]].className="playnormal";
index++;
quick++;
if(flag==true && index==EndIndex){
var parent=document.getElementById("hit_list");
var childNode=document.createElement('li');
childNode.innerHTML=<?php echo $_SESSION['member_mobile']?>+" "+hit_info['prize_name'];
parent.insertBefore(childNode,parent.childNodes[0]);
alert("恭喜你获得第"+EndIndex+"号奖品:"+hit_info['prize_name']);
}
}
</script>

浙公网安备 33010602011771号