JQuery'nin beklemede olan bir Ajax isteği olup olmadığını nasıl anlarım?


90

Yaptığımız bir jQuery denetimiyle ilgili bazı sorunlar yaşıyorum. Aradığınız öğenin kimliğini girmenize izin veren bir açılır listeniz olduğunu varsayalım ve ENTER tuşuna bastığınızda veya bir metin kutusunda odağı kaybettiğinizde, jQuery aracılığıyla girdiğiniz kimliğin doğru olduğunu onaylayarak, yoksa bir uyarı göstererek t.

Mesele şu ki, sıradan bir kullanıcı buna geçersiz bir değer girdiğinde ve gönder düğmesine basarak odağını kaybettiğinde, form gönderildikten sonra jQuery postası geri döner.

Formun gönderilmesine izin vermemek için jQuery tarafından işlenen herhangi bir Async isteği olup olmadığını kontrol etmenin herhangi bir yolu var mı?

Yanıtlar:


37

İsteklerin ne zaman aktif olduğunu takip etmek için ajaxStart ve ajaxStop kullanabilirsiniz .


Bu benim için daha iyi çalıştı, çünkü kontrolüm birçok kez HtmlHelper kullanılarak işleniyordu. Teşekkür!
sabanito

Bu benim için çalıştı! AjaxSend ve ajaxSuccess kullanıyordum, ancak bazen birkaç ajax isteği gönderildi ve yalnızca başlangıçta ve sonunda bir kod parçasını çalıştırmak istedim. ajaxStart ve ajaxStop tam olarak aradığım şeydi! Teşekkürler
ScottyG

2
2019'da bağlantılar güncel değil
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);
 });

İyi bir çözüm gibi görünüyor, ancak "Maksimum çağrı yığını boyutu" ile ilgili herhangi bir sorun tespit ettiniz mi?
Mikel

11

$ .Ajax () işlevi bir XMLHttpRequest nesnesi döndürür. Bunu, Gönder düğmesinin "OnClick" etkinliğinden erişilebilen bir değişkende saklayın. Bir gönderme tıklaması işlendiğinde, XMLHttpRequest değişkeninin şunlardan biri olup olmadığını kontrol edin:

1) null, henüz hiçbir istek gönderilmediği anlamına gelir

2) readyState değerinin 4 (Yüklendi) olduğu. Bu, isteğin başarıyla gönderildiği ve geri döndüğü anlamına gelir.

Her iki durumda da, true döndür ve gönderinin devam etmesine izin ver. Aksi takdirde, gönderimi engellemek ve kullanıcıya gönderiminin neden işe yaramadığına dair bir fikir vermek için yanlış döndür. :)


4
İstek nesnesinin var olup olmadığını belirlemek için boşluğun kontrol edilmesi önemlidir, ancak boş değilse gerçekten request.readyState > 0 && request.readyState < 4'etkin' bir istek belirlemek için kontrol etmelisiniz çünkü readyState 0, nesnenin yaratılmış olmasına rağmen bir web isteğinin başlatılmadığını belirtir. .
Nathan Taylor

1

İstek aktifse, talebi iptal etmek için $ .ajax.abort () yöntemini kullanmalıyız . Bu vaat nesnesi , isteğin etkin olup olmadığını kontrol etmek için readyState özelliğini kullanır .

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 Kodu

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

            }
        });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.