ฉันจะทราบได้อย่างไรว่า jQuery มีคำขอ Ajax ที่รอดำเนินการอยู่


90

ฉันมีปัญหากับการควบคุม jQuery ที่เราทำ สมมติว่าคุณมีรายการแบบเลื่อนลงที่ให้คุณป้อน ID ของรายการที่คุณกำลังมองหาและเมื่อคุณกด ENTER หรือสูญเสียโฟกัสในกล่องข้อความระบบจะตรวจสอบความถูกต้องผ่าน jQuery ว่า ID ที่คุณป้อนนั้นถูกต้องโดยจะแสดงการแจ้งเตือนหากไม่มี 't.

สิ่งนี้ก็คือเมื่อผู้ใช้ทั่วไปป้อนค่าที่ไม่ถูกต้องในนั้นและสูญเสียโฟกัสโดยการกดปุ่มส่งโพสต์ jQuery จะส่งคืนหลังจากส่งแบบฟอร์มแล้ว

มีวิธีใดบ้างที่ฉันสามารถตรวจสอบว่ามีการประมวลผลคำขอ Async โดย jQuery หรือไม่เพื่อที่ฉันจะไม่อนุญาตให้ส่งแบบฟอร์ม

คำตอบ:


37

คุณสามารถใช้ajaxStartและajaxStopเพื่อติดตามเมื่อมีการร้องขอ


สิ่งนี้ใช้ได้ผลดีกว่าสำหรับฉันเนื่องจากการควบคุมของฉันถูกแสดงผลหลายครั้งโดยใช้ HtmlHelper ขอบคุณ!
sabanito

สิ่งนี้ได้ผลสำหรับฉัน! ฉันใช้ ajaxSend และ ajaxSuccess แต่บางครั้งฉันมีคำขอ ajax หลายรายการที่ส่งไปและฉันต้องการเรียกใช้โค้ดเพียงครั้งเดียวในตอนเริ่มต้นและอีกครั้งในตอนท้าย ajaxStart และ ajaxStop คือสิ่งที่ฉันกำลังมองหา! ขอบคุณ
ScottyG

2
ในปี 2019 ลิงก์จะล้าสมัย
Kristian Nissen


25
 $(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);
 });

ดูเหมือนจะเป็นทางออกที่ดี แต่คุณตรวจพบปัญหาเกี่ยวกับ "ขนาดสแต็กการโทรสูงสุด" หรือไม่?
Mikel

11

ฟังก์ชัน $ .ajax () ส่งคืนอ็อบเจ็กต์ XMLHttpRequest เก็บไว้ในตัวแปรที่เข้าถึงได้จากเหตุการณ์ "OnClick" ของปุ่มส่ง เมื่อประมวลผลการคลิกส่งให้ตรวจสอบว่าตัวแปร XMLHttpRequest คือ:

1) null หมายความว่ายังไม่มีการส่งคำขอ

2) ว่าค่า readyState คือ 4 (Loaded) นั่นหมายความว่าได้ส่งคำขอและส่งคืนเรียบร้อยแล้ว

ไม่ว่าในกรณีใดก็ตามให้ส่งคืนจริงและอนุญาตให้ส่งต่อไป มิฉะนั้นจะส่งคืนเท็จเพื่อบล็อกการส่งและแจ้งให้ผู้ใช้ทราบว่าเหตุใดการส่งจึงไม่ได้ผล :)


4
การตรวจสอบค่าว่างเพื่อตรวจสอบว่าวัตถุที่ร้องขอนั้นมีความสำคัญหรือไม่ แต่ถ้าไม่เป็นโมฆะคุณควรตรวจสอบrequest.readyState > 0 && request.readyState < 4เพื่อพิจารณาคำขอที่ 'ใช้งานอยู่' เนื่องจาก readyState 0 ระบุว่าแม้ว่าวัตถุจะถูกสร้างขึ้นแล้ว แต่ยังไม่มีการเริ่มต้นคำขอเว็บ .
Nathan Taylor

1

เราต้องใช้วิธี$ .ajax.abort ()เพื่อยกเลิกคำขอหากคำขอนั้นทำงานอยู่ วัตถุสัญญานี้ใช้คุณสมบัติreadyStateเพื่อตรวจสอบว่าคำร้องขอนั้นทำงานอยู่หรือไม่

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

            }
        });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.