做一考试系统,考试时间定为分钟,考试内容10题一页,在客户端写了脚本函数,实现倒计时,在页面的onload事件里加载了倒计时函数,但每次翻页,计时器从新开始计时,有什么办法使得翻页时计时器也不变吗?
  若用服务器端计时器,好不好?怎样实现呢?

解决方案 »

  1.   

    比较不严密的办法,在页面的脚本中设置一个setTimeOut,直接定义你考试时间为第二次动作的时间,用户一打开页面,它就开始计时,时间到,自动用脚本点击提交按钮,但这种方式较不严密(取的是客户端脚本).
    另外一种,我们一样使用setTimeOut,但,是通过xmlhttp方式向服务器取时间,这样,用户打开页面时,将打开页面的时间记录在服务器上,然后不断地向服务器取时间进行比较,时间一到,强制提交页面.
    下面给你一个示例:
    //以XML求取数据
    //webFileUrl:要读取的页面地址,可带参数
    function XmlPost()
    {
      //到xxx.aspx求取时间间隔
      var webFileUrl = "xxx.aspx";
      var result = "";
      var xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
      xmlHttp.open("POST", webFileUrl, false);
      xmlHttp.send("");  //获取服务端计算时间
      result = xmlHttp.responseText;  result = new Number(result);
      if(result <= 0)
      {
        //如果服务端剩余时间小于0,则强制提交
        document.all("按钮名称").click();
      }
      else
      {
        //否则,继续求取时间,一分钟求取一次
        setTimeOut("XmlPost()",60*1000);
      }
    }
    在xxx.aspx页面,求取出时间之后,可用如下方式写:
    this.Response.Write("取到的时间值");
    this.Response.End();
      

  2.   

    楼上的方法不完善,如果客户禁用了js,就完了,。所以应该结合seesion判断。而且b/s是无状态的,这种要求对b/s来说有点勉为其难。
      

  3.   

    “如果用户禁用了javascript.....”:客户端仅仅是“提醒”作用,判断超时关键还是服务器端。1. 当页面刷新时,应该可以根据上次提交服务器的时间递减“剩余时间”。不过我不知道怎样对通讯时间和服务器延迟进行酌情扣除。2. 倒计时程序中的起点时间应该根据上述剩余时间动态生成。例如,开始倒计时的客户端函数是StartTime(),服务器处理过程用以下方法动态调用它:
      Page.RegisterStartupScript("", _
        "<script>StartTimer("+剩余时间.tostring+");</script>")
      

  4.   

    但是我记得只要用户点击网页工具栏上的红叉子就能停止脚本。要想好怎么应对。要想彻底解决问题,估计要打破web网页的默认安全性。