2009-11-30 2 views
66

Tôi đang gặp một số vấn đề với điều khiển jQuery mà chúng tôi đã thực hiện. Giả sử bạn có danh sách thả xuống cho phép bạn nhập ID của mục bạn đang tìm kiếm và khi bạn nhấn ENTER hoặc mất tiêu điểm trong hộp văn bản, nó xác thực qua jQuery rằng ID bạn đã nhập là chính xác, hiển thị cảnh báo nếu nó không 't.Làm cách nào để biết jQuery có yêu cầu Ajax đang chờ xử lý không?

Vấn đề là khi người dùng thông thường nhập giá trị không hợp lệ vào đó và mất tiêu điểm bằng cách nhấn nút gửi, bài đăng jQuery sẽ trả về sau khi gửi biểu mẫu đã được gửi.

Có cách nào để tôi có thể kiểm tra xem có bất kỳ xử lý yêu cầu Async nào của jQuery để tôi không cho phép gửi biểu mẫu không?

Trả lời

31

Bạn có thể sử dụng ajaxStartajaxStop để theo dõi thời điểm yêu cầu đang hoạt động.

+0

Điều này làm việc tốt hơn cho tôi, kể từ khi kiểm soát của tôi đã được trả lại nhiều lần bằng cách sử dụng HtmlHelper. Cám ơn! – sabanito

10

Hàm $ .ajax() trả về một đối tượng XMLHttpRequest. Lưu trữ trong một biến có thể truy cập từ sự kiện "OnClick" của nút Gửi. Khi nộp nhấp chuột được xử lý kiểm tra xem nếu biến XMLHttpRequest là:

1) null, có nghĩa là không có yêu cầu đã được gửi đi chưa

2) rằng giá trị readyState là 4 (Loaded). Điều này có nghĩa là yêu cầu đã được gửi và trả về thành công.

Trong cả hai trường hợp đó, trả về true và cho phép gửi tiếp tục. Nếu không, trả về false để chặn gửi và cung cấp cho người dùng một số dấu hiệu cho thấy lý do gửi của họ không hoạt động. :)

+3

Kiểm tra for null để xác định xem các đối tượng yêu cầu tồn tại là quan trọng, nhưng nếu nó không phải là null bạn nên thực sự kiểm tra 'request.readyState> 0 && request.readyState <4' để xác định yêu cầu 'đang hoạt động' vì readyState 0 cho biết rằng mặc dù thứ đối tượng e đã được tạo, yêu cầu web chưa được khởi tạo. –

190

$.active trả về số lượng yêu cầu Ajax đang hoạt động.

Thông tin thêm here

+0

Điều này thực sự trả lời câu hỏi. Cảm ơn. –

+0

Một lớp lót và giải pháp ngắn rất đẹp – 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

Dường như một giải pháp tốt nhưng, Bạn có phát hiện ra bất kỳ sự cố nào với "Kích thước ngăn xếp cuộc gọi tối đa" không? – Mikel

0

fiddle này sử dụng phương pháp $ .ajax.abort() để hủy bỏ yêu cầu nếu nó đang hoạt động. Nó sử dụng tài sản readyState để kiểm tra xem yêu cầu có hoạt động hay không.

Đây là 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 Mã

//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() { 

      } 
     });