今天写一个抽奖程序,想用jsp实现,想一下抽出10名中奖名单来。JavaScript来运行滚动名单,10个名单框一起滚动变换数据。要求中奖名单不重复,就在JavaScript写了个校验方法。结果出现系统提示:"该页面上的脚本造成Internet Explorer运行速度减慢。如果继续运行,您的计算机将要变慢。是否取消该脚本"。  觉得我写的东西有问题,贴出来大家给找找问题。
code:<%@ page language="java"
         session="true"
        isThreadSafe="true"
        contentType="text/html; charset=GBK" 
%>
<%@ page import="java.util.*"%>        
<%@ page import="com.servic.db.query.*"%> 
<%
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
GetPriseSet gp =  new GetPriseSet();
String result = request.getParameter("result");
String luckyname = null;
if(result!=null && !result.equals("")){
   luckyname = result;
}
if(str==null || str.length()<1){
  str = gp.getPirseName();
}

     
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<link rel="stylesheet" href="TK.CSS">
</head>
 <script language="javascript">  
  var   alldata   =   '<%=str%>' //抽奖的姓名,以,为分隔    
  var   alldataarr   =   alldata.split(",")  //中奖名单数据数组,用来在页面上滚动显示。大约有2千条数据  
  var   num   =   alldataarr.length-1   
  var   a = new Array(10);  
  var   timer
  var t    
  var go=false;
 
 function   change(){ 
   a=getArray(0,num);   
  <%
    for(int i=0;i<10;i++){
  %>     
    document.getElementById("oknum_<%=i%>").value   =   alldataarr[a[<%=i%>]];   
  <%}%>
  }   

    
  function   start(){   
  clearInterval(timer);   
  timer   =   setInterval('change()',500); //500(毫秒)为变换间隔,越小变换的越快   
  }   
    
  function   ok(){   
  clearInterval(timer);
  go = true;  
  }   
  
  function submit(){
    if(go){
       document.form1.submit(); 
    }else{
      alert("请先点击停止 选出中奖名单");
    }   
  }  function  getArray(min,max){
    var i=0;
    var b =false;
    var temp;
    while(i<10){
    temp=GetRnd(min,max);
     for (var j=0;j<a.length ;j++ )
     {
        if(a[j]==temp){
           b=true;
           break;
          }   
    }
    
       if(!b){
         a[i]=temp;
         i++;
       }
    }
    return a;
  }
   
   function  getArraySS(min,max){
     for (var j=0;j<a.length ;j++ )
     {
        a[j]=GetRnd(min,max);
    } 
    return a;
  }

  function   GetRnd(min,max){   
      t= parseInt(Math.random()*(max-min+1));
      return t;
  }  
  </script> <body bgcolor="#FFFFFF" leftmargin="0" topmargin="0">
<table width="777" border="0" cellspacing="0" cellpadding="0" height="70" align="center"></table>
<table width="777" border="0" cellspacing="0" cellpadding="0" height="28" bgcolor="67985D" align="center"><%for(int i=0;i<10;i++){ %>
<tr>
  <td>中奖姓名:<input   type="text"   id="oknum_<%=i%>"   name="oknum_<%=i%>"   value="">  </td> 
</tr><%} %><tr>
 <td><button   onclick="start()"   accesskey="s">开始(<U>S</U>)</button>  </td>   
 <td><button   onclick="ok()"   accesskey="o">停止(<U>O</U>)</button>   </td>
</tr>
<tr>
<td>
<button   onclick="submit()"   accesskey="o">中奖确认(<U>Q</U>)</button>
</td>
</tr>
<%if(luckyname!=null) {%>
<tr>
<td>
中奖名单是:<%=luckyname %>
</td>
</tr>
<%} %>
</table>
</td></table><br>
</body>
</html>

解决方案 »

  1.   

    程序主要运行是在JavaScript里面,用红色的代码会出现上面问题,占用大量cpu。我去掉重复名单校验(即用绿色的function代码部分),不会出现此问题。  感觉是红色代码的校验部分效率有问题。 求教 
      

  2.   

    b没有重置
    所以一旦判断到有过重复
    那么 if(!b){
            a[i]=temp;
            i++;
          } 
    再也不会执行了
    也就永远出不了循环
      

  3.   

     function  getArray(min,max){
        var i=0;
        var b =false;
        var temp;
        while(i<10){
        temp=GetRnd(min,max);
         for (var j=0;j<a.length ;j++ )
         {
            if(a[j]==temp){
               b=true;
               break;
              }   
        }    
           if(!b){
             a[i]=temp;
             i++;
           }
        }
        return a;
      }请教三楼,红色部分,每次进入change()方法,调用getArray方法时候,都初始化b值,判断当有重复值的时候也重置b值了
    当没有重复值的时候i++,退出while。 
    这是我写的逻辑, 你说的“b没有重置 ”是指什么? 能说的详细点么?最后把解决的办法写一下  谢谢
      

  4.   

    有问题,如果b为真的时候就会死循环,假设temp="a",a[0]="a",楼主看看是不是会死循环?while(i <10){ 
        temp=GetRnd(min,max); 
        for (var j=0;j <a.length ;j++ ) 
        { 
            //假设temp="a",a[0]="a",会使b为true并跳出For循环
            if(a[j]==temp){ 
              b=true; 
              break; 
              }  
        } 
        
           //如果b为true,那么i永远都是0
          if(!b){ 
            a[i]=temp; 
            i++; 
          } 
        } 
      

  5.   

    试验了下 果然是死循环问题 感谢sjkof 感谢benjamin_liu, 多余话不说了 结贴给分。 另把修改的发出来,有愿意看的看下 能提出问题的更加感谢。
    function  getArray(min,max){
       
        var i=0;
        var b =false;
        var temp;
        while(i<10){
         b =false;
         temp=GetRnd(min,max);
         for (var j=0;j<a.length ;j++ )
         { 
            if(a[j]==temp){
               b=true;
               continue;
              }    
       
        }    
           if(!b){
             a[i]=temp;
             i++;
           }
        }
        return a;
      }每次进入while都会重新置b的值  把break改成continue,反正就10个长度 呵呵
      

  6.   

    function  getArray(min,max){ 
    var temp; 
    var i=0;  
        while(i <10){ 
         var doFind =true; 
        while(doFind){){//执行查找,一直到找到不重复的为止
         temp = getRand(min,max);//找一个随机的
         var itemExist = false;
        for (var j=0;j <a.length ;j++ ) //循环看这个随机数是否存在
        { 
            if(a[j]==temp){ 
              itemExist = true; 
              break; 
            }  
        } 
        if(!itemExist)//如果生成的随机数不重复就停止
          doFind = false;
      }
      a[i]=temp;    
        } 
        return a; 
    }