2016-04-13 10 views
3

ページをリダイレクトしている間にダブル・サブミットを避けるために、window.onbeforeunloadをオーバーライドしようとしました。ダブルクリックを避けるためにwindow.onbeforeunloadを使用する

window.onbeforeunload = disableCurrentWindow; 
function disableCurrentWindow() 
{ 
    console.log("Before Disable the contents"); 
    window.document.body.disabled = true; 
    console.log("After Disable the contents"); 
    return undefined; 
} 

私がここに真実を返すと、それは私が現時点で必要としないデフォルトの確認ポップアップを与えます。私はちょうど次のページにユーザーをリダイレクトする必要があります。ダブルクリックを許可する必要はありません

+0

このイベントでは、確認ダイアログボックスにメッセージを表示して、現在のページに留まるか、 。 onbeforeunloadイベントを使用してダブルクリックを明確に「無効にする」とは思えません。 Firefoxブラウザにはデフォルトのポップアップが表示されます。そのブラウザはユーザー定義のメッセージをサポートしていません。 つまり、window.onbeforeunloadはstringを返す関数でなければなりません。 –

+0

@VictorPerovご意見ありがとうございます。シナリオは次のとおりです。アプリケーション間でページ間でユーザーをリダイレクトするリンクがあります。しかし、ユーザーがこれらのリンクをダブルクリックすると、GET要求がサーバー側に2回送信されることがあります。重複した提出を避けるために、共通の動作を使用して回避する必要があります。 Javascriptを使用してこの問題を解決するための他の回避策がありますか? – JagKum

答えて

0

GETリクエストをダブルサブミットすることを無効にする場合は、クリックした直後に短い時間だけ各リンクのhrefパラメータを更新しようとすることができます。

例えば、

var clickedAt = null; 
 
$(document).ready(function() { 
 
    $('a').click(function() { 
 
     if (!clickedAt) { 
 
      console.log('click allowed, destination: ' + $(this).attr('href')); 
 
      clickedAt = new Date(); 
 
      $('a').each(function() { 
 
       $(this).attr('data-href', $(this).attr('href')); 
 
       $(this).attr('href', '#'); 
 
      }); 
 
     } 
 
     else { 
 
      console.log('click masquaraded, destination: ' + $(this).attr('href')); 
 
     } 
 
     return false; 
 
    }); 
 
}); 
 
setInterval(function() { 
 
    if (typeof $ == 'undefined') return false; 
 
    if (clickedAt && new Date().getTime() - clickedAt.getTime() > 1000) { 
 
     $('a').each(function() { 
 
      $(this).attr('href', $(this).attr('data-href')); 
 
     }); 
 
     clickedAt = null; 
 
    } 
 
}, 100);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<a href="#data">data</a> <a href="#value">value</a>

しかし、私は考えていない - あなたがこれを行う必要があること。ダブルクリックはほとんどの場合問題ではありません - あなたのウェブサーバにはDDOSではありません(ダブルクリックがあなたのウェブサーバに多大な負荷をかける場合は、再設定する必要があります。いずれの場合もより強力になります)。

私は古いhrefをダンプするためにdata-hrefを使用しました。これらの属性を使用している場合は、別のバッファを1つ選択できます。

P.S.あなたのページにたくさんのリンクがある場合は、あなたの顧客にとって非常に小さな遅れを行うことができます

+0

はい、上記のようにGETリクエストを遅延させることができます。しかし、それは生産環境のための実現可能な解決策ではありません。リダイレクトする直前にイベントを処理したいので、2回目のクリックでウィンドウをブロックする必要があります。これはユーザーのためのダイアログを返すので、私はonbeforeunloadを使ってこれを達成できませんでした。 – JagKum

+0

プロダクション環境では、ダブルクリックについて心配する必要はありません。それがあなたのWebサーバーを傷つける場合は、まず、バックエンドロジックを確認するか、またはクライアントサイドにGETリクエストを作成する必要があります。 –

関連する問題