-1

ユーザーに質問のリストが表示される Q & A アプリケーションを作成しています。setTimeout() 関数を使用して質問を非表示にし、他の操作や検証も行っています。ただし、問題は、ユーザーが clearTimeout() 関数を使用して検証を簡単にバイパスできることです。

setTimeout() なしで JavaScript ポーリングを作成する他の方法はありますか。

編集:

ありがとうございます。サーバー側に検証を含めるようにコードを更新しました。しかし、好奇心に任せて、setInterval() または setTiemout() を使用せずにポーリング機能を実装する方法はありません。

4

3 に答える 3

0

clearTimeout works only if you saved "timeout id" returned by setTimeout, i.e:

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)

but in any case, you should NEVER rely only on client-side (javascript) check, server-side check is a MUST (and client-side is nice to have, in addition to that).

On server-side:

When you serve a question you simply save the timestamp somewhere (in a session variable, for example), then when you receive answer you compare current timestamp with the one saved when that question was served and make sure that user has not spent more time than allowed to answer the question. This way, even if he/she finds a way to cheat (or simply if he/she has javascript turned off) you will be sure that he/she doesn't spend more time per question than allowed.

EDIT:

As noted in comments on this answer, it is possible to cancel timeout/interval/animationframe if we do not know exact timer id, by canceling all of them in a loop. This is possible since all major browsers implement timer ids as consecutive integer numbers.

I call this workaround a hack since timerID value (returned by setTimeout/setInterval) is not defined in any specification I could find. Currently, all browsers (as it seems, haven't checked them all) use consecutive numbering scheme for timer ids. And, this is not something we can rely on as it is not standardized feature.

Anyway, what is important in my answer is that this SHOULD NOT be done in JavaScript only. Ever.

于 2012-10-11T05:29:36.567 に答える
0

jQuery には次のものがあります: http://api.jquery.com/delay/ ただし、ユーザーが JS を変更することを心配している場合は、サーバー側で検証を追加してください。JS で実行されているコードは、このようなハッキングを回避できません。

于 2012-10-11T05:24:24.917 に答える
0

最初からすべての質問をクライアント側に置くことはできません。1つの質問に答えたら、それらをロードする必要があります。基本的な手順に従ってください

  1. クライアントへの質問は 1 つだけにして、ajax を使用して回答をサーバーに送信します。
  2. 質問がクライアントに送信されたときにサーバーの日付と時刻を維持します。これを使用して、回答がサーバーに送信されたときの検証と、それにかかった時間を確認できます。
  3. クライアント側のデータを中継しない
于 2012-10-11T05:26:29.277 に答える