如何在不使用setTimeout的情况下添加延迟?

时间:2012-10-11 05:20:55

标签: javascript jquery

我正在制作Q&一个应用程序,其中将向用户呈现问题列表,并且我使用setTimeout()函数来隐藏问题以及一些其他操作/验证。但问题是用户可以通过使用clearTimeout()函数轻松绕过验证。

是否有其他方法可以在没有setTimeout()的情况下创建javascript轮询。

修改:

感谢所有人。我已更新我的代码以包含服务器端的验证。但好奇心没有任何方法可以在不使用setInterval()或setTiemout()的情况下实现轮询功能

3 个答案:

答案 0 :(得分:0)

jQuery有一个:http://api.jquery.com/delay/ 但是如果你担心用户改变你的JS,请在服务器端添加验证,在JS中运行的代码不能避免这样的黑客攻击。

答案 1 :(得分:0)

首先,您无法在客户端提出所有问题!一旦一个问题得到解答,你必须加载它们,按照基本步骤

  1. 只向客户提出一个问题,使用ajax提交您对服务器的回答。
  2. 维护将问题发送到客户端时的服务器日期和时间,您可以在将答案提交给服务器以及已经花了多长时间时将其用于验证。
  3. 不要继续使用客户端数据,开发人员工具大多数人都可以使用您的系统

答案 2 :(得分:0)

clearTimeout仅在您保存setTimeout返回的“timeout id”时才有效,即:

var timer = setTimeout(foo, delay);
...
clearTimeout(timer); // works;

setTimeout(bar, delay);
...
// to cancel previous timer, we must use a "hack" (as no reference is saved, look at EDIT below)

但是在任何情况下,你都不应该只依赖客户端(javascript)检查,服务器端检查是必须的(除此之外,客户端也很好)。

在服务器端:

当您提出问题时,您只需将时间戳保存在某处(例如,在会话变量中),然后当您收到答案时,将当前时间戳与提供该问题时保存的时间戳进行比较,并确保用户尚未花费比允许回答问题的时间更长。这样,即使他/她找到了欺骗的方式(或者只是他/她关闭了javascript),你也可以确保他/她不会花费更多的时间来处理每个问题。

修改

如对此答案的评论中所述,如果我们不知道确切的计时器ID,则可以取消超时/间隔/动画帧,方法是在循环中取消所有这些。这是可能的,因为所有主流浏览器都将定时器ID实现为连续整数。

我将此解决方法称为hack,因为我无法在任何可以找到的规范中定义timerID值(由setTimeout / setInterval返回)。目前,所有浏览器(看起来都没有全部检查过)都使用连续编号方案来定时器ID。而且,这不是我们可以依赖的东西,因为它不是标准化的功能。

无论如何,在我的回答中重要的是,不应该仅在JavaScript中完成。如初。