我正在创建一个问答应用程序,其中将向用户显示问题列表,并且我正在使用 setTimeout() 函数来隐藏问题以及其他一些操作/验证。但问题是用户可以使用 clearTimeout() 函数轻松绕过验证。
有没有其他方法可以在没有 setTimeout() 的情况下创建 javascript 轮询。
编辑:
谢谢大家。我已经更新了我的代码以在服务器端包含验证。但是好奇的基础是没有任何方法可以在不使用 setInterval() 或 setTiemout() 的情况下实现轮询功能
我正在创建一个问答应用程序,其中将向用户显示问题列表,并且我正在使用 setTimeout() 函数来隐藏问题以及其他一些操作/验证。但问题是用户可以使用 clearTimeout() 函数轻松绕过验证。
有没有其他方法可以在没有 setTimeout() 的情况下创建 javascript 轮询。
编辑:
谢谢大家。我已经更新了我的代码以在服务器端包含验证。但是好奇的基础是没有任何方法可以在不使用 setInterval() 或 setTiemout() 的情况下实现轮询功能
jQuery 有一个:http ://api.jquery.com/delay/ 但是如果您担心用户更改您的 JS,请在服务器端添加验证,在 JS 中运行的任何代码都无法避免这种 hack。
好吧,一开始你不能把所有的问题都放在客户端!回答一个问题后,您必须加载它们,请按照基本步骤操作
仅当您保存了 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 中完成。曾经。