我正在制作Q&一个应用程序,其中将向用户呈现问题列表,并且我使用setTimeout()函数来隐藏问题以及一些其他操作/验证。但问题是用户可以通过使用clearTimeout()函数轻松绕过验证。
是否有其他方法可以在没有setTimeout()的情况下创建javascript轮询。
修改:
感谢所有人。我已更新我的代码以包含服务器端的验证。但好奇心没有任何方法可以在不使用setInterval()或setTiemout()的情况下实现轮询功能
答案 0 :(得分:0)
jQuery有一个:http://api.jquery.com/delay/ 但是如果你担心用户改变你的JS,请在服务器端添加验证,在JS中运行的代码不能避免这样的黑客攻击。
答案 1 :(得分:0)
首先,您无法在客户端提出所有问题!一旦一个问题得到解答,你必须加载它们,按照基本步骤
答案 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中完成。如初。