3

ユーザーが押すことができる賛成票ボタンがあり、投票が登録されます。このボタンをもう一度クリックすると、投票がキャンセルされます。

したがって、このボタンを押すたびに、データベースへの書き込みが行われます。このボタンでオートクリッカーが継続的に使用されると、継続的な DB 呼び出しが発生します。これを防ぎたい。私に何ができる?

PS。賛成ボタンがクリックされたときに、バックエンド(Djangoを実行)にajaxクエリを送信しています。

4

5 に答える 5

3

サーバー上でこれを確認したいので、誰かが JavaScript を無効にしても問題ありません。

PHP を使用している場合、1 つのオプションは、投票間に時間制限を設定することです。たとえば、1 分間に 1 票のみを許可します。

したがって、投票ごとに、投票の時間をセッション変数に保存し、制限時間内であれば後続の投票を無視します。

//on vote
$now=date('U');
if(!isset($_SESSION['lastvote']) || $now - $_SESSION['lastvote']<LIMIT){
    $_SESSION['lastvote']=$now;
    // do database call

}else{
    //throw error
}
于 2012-12-18T09:29:19.960 に答える
1

おそらく最も簡単な方法は、1 つの操作の実行中にボタンを無効にすることです。

これを取得するには、JQuery ajax リクエストを使用して「upvote」/「downvote」メソッドを呼び出すと仮定すると、次のようにするだけです。

$("#upvoteButton").click(function)
{
    $("#upvoteButton").attr("disabled");
    $.ajax({
      url: 'url/upvote.extension',
      success: function(data) {
        $("#upvoteButton").removeAttr("disabled");
      }
    });
}

このようにして、単一のリクエストが単一のタブ/ウィンドウごとに送信および解決されます。

于 2012-12-18T09:21:38.877 に答える
0

簡単な方法:

<button id="upvote" onclick="upvote(this)">Up</button>

<script>
   var upvote = function(x){
      $(x).removeAttr('onclick'); //if you click this button again, it will do nothing

      //call ajax to do something here...
      //...............
      //after finishing, add attribute onclick to the button
      $(x).attr('onclick', 'upvote(this)')
   };
</script>
于 2015-11-19T15:56:21.040 に答える
0

ユーザーが Cookie を受け入れると信じている場合は、クリックをオブジェクト ID とタイムスタンプと共にセッションに保存し、ユーザーが最後の n 秒間に投票ボタンをクリックしたかどうかをテストできます。

また、JavaScript を使用して Web ページの投票ボタンを無効にし、n 秒後に再度有効にして投票を取り消すこともできます。

どちらの提案も、JavaScript 対応または Cookie 対応のブラウザーを使用しているユーザーに依存しています。

URL をサーバーに繰り返し送信するだけのボットを考慮する必要がある場合は、別のアプローチを取る必要があります。たとえば、現在の IP アドレスが最後の n 秒間に URL を呼び出したかどうかを確認し、403 Forbidden http エラーを発生させるか、なにか。

于 2012-12-18T09:18:43.717 に答える
0

使用できる場合は、setTimeout次のようなものを試すことができます。

var toggleVote = (function () {
  var voted = false,timeout;
  return function () {
     if( timeout )
       clearTimeout(timeout)

     voted = !voted

      timeout = setTimeout(function() {
        console.log("Ajax call - vote : " + voted)
      },400)
    }
  })()

document.getElementById("vote").addEventListener("click",toggleVote)

JSBinの例を次に示します。

"Click me" div をつぶしてみてください

于 2012-12-18T09:27:47.530 に答える