Ajax istəklərini jQuery ilə ləğv edin

JQuery istifadə edərək, hələ cavab almayan bir Ajax sorğusunu necə ləğv edə bilərəm?

1634
15 янв. 15 yanvarda lukewm qurdular 2009-01-15 15:45 '09 saat 15:45 'da 2009-01-15 15:45
@ 1 cavab

Ən jQuery Ajax metodları XMLHttpRequest obyektini (və ya ekvivalenti) qaytarır, buna görə də abort() istifadə edə bilərsiniz.

Sənədlərə baxın:

  • kəsilmə üsulu ( MSDN ). Cari HTTP sorğusunu ləğv edir.
  • abort () ( MDN ). Tələb artıq göndərilmişdirsə, bu üsul tələbi ləğv edəcəkdir.
 var xhr = $.ajax({ type: "POST", url: "some.php", data: "name=John success: function(msg){ alert( "Data Saved: " + msg ); } }); //kill the request xhr.abort() 

YENİLİKLƏ: jQuery 1.5 ilə qaytarılan obyekt jqXHR adlı öz XMLHttpRequest obyekti üçün bir sarmalandır. Bu obyekt bütün xüsusiyyətlərini və metodlarını açıqlayır, buna görə də yuxarıda göstərilən nümunə hələ də işləyir. Baxın JqXHR obyekti (jQuery API sənəd).

ƏLAVƏ 2: jQuery 3 ilə başlayaraq, ajax metodu indi əlavə üsullarla (məsələn, interrupt) bir söz verir, belə ki, qaytarılmış obyekt artıq xhr deyil, yuxarıdakı kodu hələ də işləyir. Burada Blog 3.0-a baxın.

ƏLAVƏ 3 : xhr.abort() hələ də jQuery 3.x ilə işləyir. 2 yeniləmənin doğru olduğunu düşünməyin. JQuery Github deposu haqqında daha çox məlumat əldə edin .

1593
15 янв. Cavab 15 yanvarda mənə verilir 2009-01-15 15:56 '09 saat 15:56 'da 2009-01-15 15:56

İstədiyiniz xatırlamanı xatırlaya bilmərik, amma cavabın gözardı ediləcəyi vaxtdan sonra zamanaşım dəyərini təyin edə bilərsiniz. JQuery AJAX parametrləri üçün bu səhifəyə baxın . Hesab edirəm ki, gözləmə müddəti aşılırsa geri çağırılacaqsınız. Standart Açıqlama zamanı hər AJAX tələbi üçün əvvəlcədən təyin edilmiş vaxt.

border=0

İstədiyiniz obyektin abort () metodundan istifadə edə bilərsiniz, lakin bu, müştəri hadisə dinləməsini dayandırmasına səbəb olarkən, server onu işləməyini dayandıra bilməz.

106
15 янв. Cavab tvanfosson tərəfindən verilir Yanvar 15 2009-01-15 15:55 '09 saat 15:55 'də 2009-01-15 15:55

Bu tələb asinxron deyildir, yəni orada göndərilir.

Sunucunuz bir AJAX sorğusu səbəbiylə çox bahalı bir əməliyyat başlatırsa, ən yaxşı şey, sunucunuzun iptal isteklerini dinləmək və hər şeyi dayandırmaq üçün sunucuyu bildirən ayrı AJAX sorğu göndərmək üçün açar.

Əks halda, yalnız AJAX cavabını görməyin.

70
15 янв. Yuval Adam tərəfindən verilmiş cavab Jan 15 2009-01-15 15:56 '09 saat 15:56 'da 2009-01-15 15:56

Serialda etdiyiniz zəngləri saxla, sonra hər birinə xhr.abort () çağırın.

BÜTÜN QAVEAT: İstədiyiniz işi dayandırmaq olar, ancaq bu yalnız müştəri tərəfidir. Server tərəfi hələ də tələbi işlədə bilər. Session data ilə PHP və ya ASP kimi bir şey istifadə edirsinizsə, ajax başa çatana qədər sessiya məlumatları bloklanır. Beləliklə, istifadəçinin veb saytına baxmağa davam etməsinə icazə vermək üçün session_write_close () çağırmalısınız. Bu sessiyanı saxlayır və davamı gözləyən digər səhifələrin işini davam etdirmək üçün onu açır. Bu olmadan, bir neçə səhifə kiliddən çıxarılmasını gözləmək olar.

62
28 марта '12 в 14:34 2012-03-28 14:34 Cavab Tei tərəfindən 28 mart '12, saat 14:34 'də verilir 2012-03-28 14:34

AJAX müraciətləri başladıldığı sırada icra edilə bilməz. Aradan qaçmaq yerinə, sonuncu istisna olmaqla, bütün AJAX cavablarını göz ardı edə bilərsiniz:

  • Sayaç yaradın
  • AJAX sorğusunu başladarkən saytı artırın
  • "Möhür" sorgusu üçün mövcud sayma dəyərini istifadə edin
  • Uğurlu geri çağırışda, ən son tələb olub olmadığını görmək üçün möhürü əks tərəfə müqayisə edin.

Kobud kod sxemi:

 var xhrCount = 0; function sendXHR() { // sequence number for the current invocation of function var seqNumber = ++xhrCount; $.post("/echo/json/", { delay: Math.floor(Math.random() * 5) }, function() { // this works because of the way closures work if (seqNumber === xhrCount) { console.log("Process the response"); } else { console.log("Ignore the response"); } }); } sendXHR(); sendXHR(); sendXHR(); // AJAX requests complete in any order but only the last // one will trigger "Process the response" message 

JsFiddle demosu

45
18 янв. Cavab 18 yanvarda Salman A tərəfindən verilir . 2014-01-18 15:55 '14 saat 15:55 2014-01-18 15:55

Biz bu problemi həll etməli və üç müxtəlif yanaşmanı sınamalıyıq.

  • @meouw tərəfindən təklifi ləğv edir
  • bütün tələbi tamamlayır, lakin sonuncu göndərmənin nəticəsini işləyir
  • başqasının yerinə yetirilməsinə qədər yeni istəkləri qarşısını alır

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <input id="button" type="button" value="click" /> 

Bizim vəziyyətimizdə server üçün daha az yük yaratdığına görə # 3 yanaşma tətbiq etməyə qərar verdik. Amma jQuery .complete () metoduna zəmanət verirsə, mən 100% əmin deyiləm ki, bu bir kilitləməyə səbəb ola bilər. Testlərimizdə bu vəziyyəti təkrarlaya bilmərik.

36
06 марта '13 в 17:29 2013-03-06 17:29 cavab mart ayının 6-da saat 17 : 29 -da verilir

Həmişə belə bir şey etmək daha yaxşıdır.

 var $request; if ($request != null){ $request.abort(); $request = null; } $request = $.ajax({ type : "POST", //TODO: Must be changed to POST url : "yourfile.php", data : "data" }).done(function(msg) { alert(msg); }); 

Amma əgər, əgər ajax sorğunun sıfır olub olmadığını yoxlamaq yoxsa yoxsa yoxsa daha yaxşıdır.

30
15 окт. 15 oktyabrda Tharindu Kumara'ya cavab verdi 2014-10-15 12:14 '14 at 12:14 2014-10-15 12:14

meouw həlli doğru, amma daha çox nəzarət istəyirsinizsə, jQuery üçün Ajax Manager Plugin-i cəhd edə bilərsiniz.

19
15 янв. Prestaul tərəfindən verilmiş cavab yanvar 15 2009-01-15 18:45 '09, 18:45 'da, 2009-01-15 18:45

Gerçək vaxtda aradım və son / ən son tələbdən daha uzun müddət almış ola biləcəyini gözləyən istəkləri ləğv etmək istəmişəm.

Mənim vəziyyətimdə belə bir şey istifadə etdim:

 //On document ready var ajax_inprocess = false; $(document).ajaxStart(function() { ajax_inprocess = true; }); $(document).ajaxStop(function() { ajax_inprocess = false; }); //Snippet from live search function if (ajax_inprocess == true) { request.abort(); } //Call for new request 
11
04 дек. Cavab Billy 04 dekabr verilir. 2013-12-04 17:43 '13 at 17:43 2013-12-04 17:43

Axındakı bir çox insanlar, sorğu müştərinin tərəfində kəsildiyinə görə, server hələ də tələbi işləyəcəkdir. Bu, serverdə lazımsız bir yük yaradır, çünki interfeysdə dinləməyi dayandırdığımız işi yerinə yetirir.

Mən həll etməyə çalışdığım problem (başqaları daxil ola bilər) istifadəçi giriş sahəsindəki məlumatları daxil etdikdə, mənə anında bir Google Instant növü üçün sorğu vermək istəmişəm.

Gərəksiz sorguları atmamaq və ön uça əlavə olunmamaq üçün aşağıdakıları etdim:

 var xhrQueue = []; var xhrCount = 0; $('#search_q').keyup(function(){ xhrQueue.push(xhrCount); setTimeout(function(){ xhrCount = ++xhrCount; if (xhrCount === xhrQueue.length) { // Fire Your XHR // } }, 150); }); 

Bu, əslində hər 150 ms bir tələbi (ehtiyaclarınız üçün özelleştirebileceğiniz değişken) göndərəcəkdir. Burada baş verənləri başa düşməkdə probleminiz varsa, xhrCountxhrQueue ı if blokundan hemen əvvəl konsolunuza yazın.

10
03 февр. cavab verildi brianrhea 03 Feb. 2014-02-03 21:43 '14 at 21:43 2014-02-03 21:43

Yalnız xhr çağırın. abort () bir jquery ajax obyekti və ya doğma XMLHTTPRequest obyektidir.

Məsələn:

 //jQuery ajax $(document).ready(function(){ var xhr = $.get('/server'); setTimeout(function(){xhr.abort();}, 2000); }); //native XMLHTTPRequest var xhr = new XMLHttpRequest(); xhr.open('GET','/server',true); xhr.send(); setTimeout(function(){xhr.abort();}, 2000); 
9
28 мая '15 в 12:17 2015-05-28 12:17 Cavab 28 may tarixində, saat 15: 00-da başlayaraq 2015-05-28 12:17 ilə verilir

Bunu etmək üçün etibarlı bir yol yoxdur və istək yolda olduqda hətta cəhd etməyəcəyəm; ağıllı cavab vermənin yeganə yolu cavabı görməməkdir.

Çox hallarda bu, belə vəziyyətlərdə baş verə bilər: istifadəçi bir çox ardıcıl XHRs-i tez-tez buraxan düyməni basdıra bilər, burada bir çox seçim var, ya da XHR-ə qayıtdıqdan və ya yeni XHR-in tetiklenene qədər düyməni kilidləyin. və digər işlərdə, istifadəçinin geri çağırdığını və ya gözlənilən XHR cavabını ləğv etdiyini xatırlatmaqla, ancaq son.

8
17 июня '15 в 21:44 2015-06-17 21:44 cavab 17 iyun 'da 21:44' da verilir. 2015-06-17 21:44

Məsələn, ajax.abort () funksiyasından istifadə edin, məsələn, bu kimi başqa bir göndərməzdən əvvəl hər hansı bir bekleyen ajax sorğusunu kəsə bilərsiniz

 //check for existing ajax request if(ajax){ ajax.abort(); } //then you make another ajax request $.ajax( //your code here ); 
8
08 нояб. Cavab Joecoder001 08 Noyabr. 2013-11-08 11:07 '13 at 11:07 2013-11-08 11:07

Sorğunun bir problemi var idi və səhifəni bağladıqdan sonra sorğu davam etdi, buna görə də istifadəçi yeniləməni qaçırdı, çünki mysql dəyəri növbəti bir 50 saniyə ərzində səhifənin qapalı olduğuna görə təyin olundu, baxmayaraq ki, ajax sorğusunu öldürdüm, $ _SESSION Quraşdırma üçün var anketində bitməyincə yenilənməyəcək və yeni bir başlanılmayacaqdır, beləliklə mən veritabanımda 0 = off page kimi dəyər verirdim, halbuki mən soruşuram ki, bu simli tələb edirəm və yalançı oluruq; Anketdə bir sorğu olaraq 0 olduğunda, cari qiymətləri alırsınız, açıqca ...

İnşallah bu kömək etdi.

4
25 июля '13 в 15:44 2013-07-25 15:44 Cavab Marcus 25 iyul 'da 15:44' də verilir 2013-07-25 15:44

Aşağıdakı kod, Ajax sorğusunun başlamasının yanı sıra başlanğıcını göstərir:

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <input type="button" class="go" value="GO!" > <input type="button" class="stop" value="STOP!" > 
4
04 янв. cavab zloctb 04 jan verilir . 2016-01-04 16:35 '16 saat 16:35 'da 2016-01-04 16:35

AJAX sorğusunu necə ləğv etdiyini nümayiş etdirən bir nümayişi paylaşdım - məlumatlar əvvəlcədən təyin edilmiş bir zamanaşımda serverdan qaytarılmadıqda.

HTML:

 <div id="info"></div> 

JS KODU:

 var isDataReceived= false, waitTime= 1000; $(function() { // Ajax request sent. var xhr= $.ajax({ url: 'http://api.joind.in/v2.1/talks/10889', data: { format: 'json' }, dataType: 'jsonp', success: function(data) { isDataReceived= true; $('#info').text(data.talks[0].talk_title); }, type: 'GET' }); // Cancel ajax request if data is not loaded within 1sec. setTimeout(function(){ if(!isDataReceived) xhr.abort(); },waitTime); }); 
2
12 февр. Cavab 12 fevralda ganesh tərəfindən verilir. 2016-02-12 08:25 '16 saat 08:25 'də 2016-02-12 08:25

Əgər xhr.abort(); bir səhifə yenidən yüklənməyə səbəb olur,

Sonra qarşısını almaq üçün müdaxilə etmədən onreadystatechange qura bilərsiniz:

 // ↓ prevent page reload by abort() xhr.onreadystatechange = null; // ↓ may cause page reload xhr.abort(); 
2
23 окт. Cavab 23 oktyabr tarixində verilir . 2016-10-23 14:56 '16 saat 02:56 'də 2016-10-23 14:56

Bunu istifadə edərək hər hansı bir davamlı ajax zəngini poza bilərsən

 <input id="searchbox" name="searchbox" type="text" /> <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script> <script type="text/javascript"> var request = null; $('#searchbox').keyup(function () { var id = $(this).val(); request = $.ajax({ type: "POST", //TODO: Must be changed to POST url: "index.php", data: {'id':id}, success: function () { }, beforeSend: function () { if (request !== null) { request.abort(); } } }); }); </script> 
1
18 мая '18 в 16:17 2018-05-18 16:17 18 May 18: 16-da Soubhagya Kumar'a cavab verdi
 $.ajax({ type: "POST", url: "handlername", data: "paramerers", success: function(msg){ alert( "Result: " + msg ); }, error: function() { alert("Error Message"); }, datatype : JSON, async: false, cache: false }); 
-6
03 дек. Cavab Rohit Chidrewar tərəfindən verilir 03 Dek 2017-12-03 01:20 '17 də 1:20 2017-12-03 01:20

və ya bir sual yazıları ilə bağlı digər suallar