2009-11-30 11 views
66

私が作ったjQueryコントロールにいくつか問題があります。探している項目のIDを入力できるドロップダウンリストがあるとし、Enterキーを押すかテキストボックスでフォーカスを失うと、jQueryを使って入力したIDが正しいかどうかを確認し、正しくない場合は警告を表示します't。jQueryに保留中のAjaxリクエストがあるかどうかを知るにはどうすればよいですか?

一般的なユーザーが無効な値を入力し、送信ボタンを押してフォーカスを失った場合、フォームの送信が送信された後、jQueryポストが返されます。

フォームの送信を許可しないように、非同期リクエスト処理がjQueryで処理されているかどうかを確認する方法はありますか?

答えて

31

ajaxStartajaxStopを使用して、いつリクエストがアクティブであるかを把握できます。

+0

私のコントロールがHtmlHelperを使って何度もレンダリングされていたので、これは私のためにはうまくいきました。どうも! – sabanito

10

$ .ajax()関数は、XMLHttpRequestオブジェクトを返します。送信ボタンの "OnClick"イベントからアクセス可能な変数に格納します。 )

1ヌル、何の要求はreadyStateの値が(ロード)4であることをまだ

2)送信されていないことを意味:場合は、[送信]をクリックしますは、XMLHttpRequestの変数があるかどうかを確認するためにチェックを処理しています。これは、要求が送信され、正常に返されたことを意味します。

いずれの場合もtrueを返し、送信を続行します。それ以外の場合は、falseを返してサブミットをブロックし、ユーザーにサブミットが機能しなかった理由を通知します。 :)

+3

要求オブジェクトが存在するかどうかを判断するためにはnullをチェックされては重要ですが、それはあなたがすべきnullでない場合readyState 0は、実際には要求されていないにもかかわらず、実際には要求されていないため、 'request.readyState> 0 && request.readyState <4'を実際にチェックして、オブジェクトが作成された場合、Web要求は開始されていません。 –

190

$.activeアクティブなAjaxリクエストの数を返します。

詳細情報here

+0

これは実際に質問に答えます。ありがとう。 –

+0

1つのライナーと短いソリューションが非常にいい – MSTdev

23
$(function() { 
     function checkPendingRequest() { 
      if ($.active > 0) { 
       window.setTimeout(checkPendingRequest, 1000); 
       //Mostrar peticiones pendientes ejemplo: $("#control").val("Peticiones pendientes" + $.active); 
      } 
      else { 

       alert("No hay peticiones pendientes"); 

      } 
     }; 

     window.setTimeout(checkPendingRequest, 1000); 
}); 
+0

良い解決策に見えますが、「最大呼び出しスタックサイズ」の問題を検出しましたか? – Mikel

0

このバイオリンは、それがアクティブな場合は、要求を中止する$ .ajax.abort()メソッドを使用しています。 readyStateプロパティを使用して、要求がアクティブかどうかを確認します。

これはWorking Fiddle

HTML

<h3>Cancel Ajax Request on Demand</h3> 
<div id="test"></div> 
<input type="button" id="btnCancel" value="Click to Cancel the Ajax Request" /> 

JSコード

//Initial Message 
var ajaxRequestVariable; 
$("#test").html("Please wait while request is being processed.."); 

//Event handler for Cancel Button 
$("#btnCancel").on("click", function(){ 
if (ajaxRequestVariable !== undefined) 

if (ajaxRequestVariable.readyState > 0 && ajaxRequestVariable.readyState < 4) 
{ 
    ajaxRequestVariable.abort(); 
    $("#test").html("Ajax Request Cancelled."); 
} 
}); 

//Ajax Process Starts 
ajaxRequestVariable = $.ajax({ 
      method: "POST", 
      url: '/echo/json/', 
      contentType: "application/json", 
      cache: false, 
      dataType: "json", 
      data: { 
     json: JSON.encode({ 
     data: 
      [ 
          {"prop1":"prop1Value"}, 
        {"prop1":"prop2Value"} 
        ]   
     }), 
     delay: 11 
    }, 

      success: function (response) { 
      $("#test").show(); 
      $("#test").html("Request is completed");   
      }, 
      error: function (error) { 

      }, 
      complete: function() { 

      } 
     }); 
関連する問題