2012-05-04 4 views
0

私はAjaxリクエストを使用してJqueryでフォームを投稿しています。ajaxリクエストがJqueryで既に送信されているかどうかをチェックする方法?

$.ajax( 
     { 
      type: "POST", 
      url: "login.php", 
      data: $("#signin").serialize(), 
      dataType: "json", 
      cache: false, 
      success: function(data, textStatus) { 
       if (data.redirect) { 
        window.location.replace(data.redirect); 
       } 
       else { 
        $('#some').fadeOut(200); 
        $('#some2').fadeIn(200); 
        $("#some3").html(data.form); 
        $("#some").delay(2000).fadeOut(200); 
        $('#some2').delay(2800).fadeIn(300); 
       } 
      }   
     }); 

ここで、「ログイン」ボタンをクリックするとすぐにajaxリクエストが行われます。問題は、今度は、ボタンを何度か押すとelse caseが数回実行され、#some、#some2、#some3がフェードアウトして何度か繰り返されるということです。では、リクエストが既に送信されているかどうかを(DBに何かを書き込むことなく)確認する方法はありますか?

+2

はすぐにボタンのフックを外しますそれがクリックされると、成功またはエラーのためにハンドラで完了時に再度添付してください – Miquel

+0

またはボタンを無効にして、同時にユーザにフィードバックを与えます。 – jeroen

答えて

0

からhere

.one()メソッドを使用して、ajaxコールバックで再度設定できます。

function doAjax(){ 
    // Your Ajax call. 
    $.ajax({..., complete: function() { 
     // Ajax call done, re-enabling the button/link 
     $("#buttonId").one('click', doAjax); 
    }, ...}); 
} 

$("#buttonId").one('click', doAjax); 
+0

最初の '$("#buttonId ")one( 'click'、doAjax);をelse caseの背後にある成功事例に入れるとその後、リンクはすぐに私に同じ問題を与えるために再度有効になります... – phpheini

+0

私はそれを成功の代わりに 'complete'コールバックに入れます。そうすれば、コールが成功しなかった場合、イベントは再び再バインドされます。 – Kamyar

+0

私はこれを 'complete'コールバックに入れましたが、' $( "buttonId")。one( 'click'、doAjax); '完全コールバックの中では' success'コールバックが終了しました... – phpheini

0

このフラグをtrueに設定して、ログイン時にブール値のフラグ、たとえばlogin_in_processを作成します。 trueの場合はクリックごとにこのフラグをチェックしてから空の復帰を行います。成功とエラーのコールバックではfalseの状態に設定します。あなたはそれがクリックされたか否かを記録するためのブール値を使用することができます

0

var loginClicked = false; 

$('input_button_element').click(function(){ 
    if (!loginClicked) { 
    loginClicked = true; 
    // your js here - you may want to add some visual feedback to the user also 
    } 
}); 
0

あなたが最初にその値

をチェックし、あなたのメソッド内でグローバルVAR

var loginClick = false; 

を作ることができます

if (!loginClick) { 
    loginClick = true; 
    //your ajax code; 
} 
+0

var loginClick = false;私は私の書類に入れたい。 私の関数ログインがdocument.ready部分の中にないためです。それにもかかわらず、それは動作しますか? – phpheini

+0

意味がありません。あなたはそこに置くことができますが、ドキュメントの外側に置くこともできます.ready – AndVla

0

グローバルスコープにブール値を格納する必要があります。

if (!window.isClicked) { 
    window.isClicked = true; 
    ...Do your ajax call here   
} 

だけでなく、AJAXの成功コールバック(中、常にwindow.isClickedの値を復元することを忘れないでください)::windowオブジェクトに格納されている1つ

var jqxhr = $.ajax(...) 
.done(function() { }) 
.fail(function() { }) 
.always(function() { window.isClicked = false }); 
+1

グローバルスコープをより良く流す悪い習慣は、関数スコープ内に変数があるだけです。 –

+0

もっと同意できませんでした。私は何を喫煙していたかわからない:) – jkgeyti

関連する問題