-1

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

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

编辑:

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

4

3 回答 3

0

jQuery 有一个:http ://api.jquery.com/delay/ 但是如果您担心用户更改您的 JS,请在服务器端添加验证,在 JS 中运行的任何代码都无法避免这种 hack。

于 2012-10-11T05:24:24.917 回答
0

好吧,一开始你不能把所有的问题都放在客户端!回答一个问题后,您必须加载它们,请按照基本步骤操作

  1. 只带一个问题给客户端,用ajax把你的答案提交给服务器。
  2. 当问题发送到客户端时,维护服务器的日期和时间,您可以使用它来验证何时将答案提交到服务器以及花费的时间。
  3. 不要中继客户端数据,开发人员工具大多可用,人们可以使用您的系统
于 2012-10-11T05:26:29.277 回答
0

仅当您保存了 setTimeout 返回的“超时 id”时,clearTimeout 才有效,即:

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 中完成。曾经。

于 2012-10-11T05:29:36.567 回答