2009-03-01 7 views
12

पढ़ने के लिए धन्यवाद।jQuery: पृष्ठ अनलोड पर स्वचालित रूप से AjaxRequests को निरस्त करें?

मैंने देखा है कि यदि मेरे पास एक पृष्ठ है जिसमें एक या अधिक AJAX अनुरोध खुले हैं, और मैं एक पृष्ठ छोड़ने के लिए एक लिंक पर क्लिक करता हूं, या इसे रीफ्रेश करता हूं, तो यह अजाक्स अनुरोधों को अनलोड करने से पहले पूरा करने की प्रतीक्षा करेगा।

यह आमतौर पर एक मुद्दा नहीं है, लेकिन अगर अनुरोध में कुछ समय लगता है, तो यह हो सकता है।

मैं की तरह कुछ के लिए देख रहा हूँ:

$(window).bind("beforeunload", function() {AjaxRequest.abort();}); 

स्वचालित रूप से अनलोड पहले कभी अनुरोधों को निरस्त करने के लिए है, लेकिन काफी यकीन नहीं ajax अनुरोध लगाने के लिए कैसे। क्या वे कहीं खिड़की के नीचे होंगे?

उत्तर

8

$.ajax() jQuery विधि XMLHttpRequest ऑब्जेक्ट देता है। इसका मतलब है कि आप ऑब्जेक्ट पर मानक विधियों को लागू कर सकते हैं, जैसे abort()।

unload jQuery ईवेंट विधि में निर्मित उपयोग को अनलोड करने के लिए।

var myajax = $.ajax(...); 
$(window).unload(function() { myajax.abort(); }); 
+0

मैं एक जे एस त्रुटि मिल रही है "myajax.abort" एक फंक्शन नहीं है (jquery 1.3.2) क्या किसी ने "निरस्त जानवर" को दोषी ठहराया है? – taber

+0

संपादित करें: मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं अपने $ .ajax (...) कॉल के अंत में ".responseText" का उपयोग कर रहा था। मैंने बाहर निकाला .responseText और अब कोई त्रुटि नहीं है। वाह। – taber

+0

'अनलोड' विधि Jquery में हटा दी गई है:/ – Badiparmagi

1

लगता है कि तुम प्रत्येक अनुरोध के लिए window.onunload घटना प्लस AjaxRequestX = $ .Get (...) जरूरत है, हो सकता है सरणी में वस्तुओं रखने के लिए और अनलोड पर उन के माध्यम से जाना।

4

मुझे अभी यह समस्या थी, मैं PHP में एक लूप-लूप कर रहा था जिसे $ .ajax से बुलाया जा रहा था। मेरा समाधान session_write_close() जोड़ना था; लंबे लूप से पहले।

मेरा सिद्धांत यह है कि क्रोम अगले पृष्ठ से पहले किसी भी पृष्ठभूमि AJAX अनुरोधों को रद्द करने का अनुरोध करता है। यदि आपका AJAX अनुरोध वही _SESSION है जिस पृष्ठ पर आप नेविगेट कर रहे हैं और फिर से, तो आपके पास PHP कोड की पहली पंक्ति भी हिट होने से पहले एक डेडलॉक है।

+1

आपके उत्तर ने मेरी समस्या हल की - बहुत बहुत धन्यवाद! –

1

आपको अपने सभी AJAX अनुरोध को जारी रखना होगा और जब पृष्ठ सभी अनुरोधों को निरस्त कर रहा है। निम्नलिखित कोड का परीक्षण किया और रोकता है नमूना

var _requests = []; 

var _abortAllRequests = function() { 
    $(_requests).each(function (i, xhr) { xhr.abort(); }); 

    _requests = []; 
} 

$(window).on("beforeunload", function() { 
    _abortAllRequests(); 
}); 
कहीं अपने कोड में

_requests.push($.ajax(...)) 

इसके अतिरिक्त आप के साथ घटनाओं ajaxStart ajaxStop $ .ajaxSetup का उपयोग किया अनुरोध पॉप कर सकते हैं, लेकिन इसके ऊपर आप

5

को क्रोम में पेज अनलोड पर सभी बकाया jQuery AJAX अनुरोध, लेकिन यह एज और आईई द्वारा ग्राहकों के साथ-साथ त्रुटि के बिना भी उपयोग किया जाता है।

निम्नलिखित रखो पहले jQuery ready हैंडलर के रूप में:

$(onPageLoaded) 

और यह कहीं सुलभ डाल:

function onPageLoaded() { 
    var jqxhrs = []; 

    $(window).bind("beforeunload", function (event) { 
     $.each(jqxhrs, function (idx, jqxhr) { 
      if (jqxhr) 
       jqxhr.abort(); 
     }); 
    }); 

    function registerJqxhr(event, jqxhr, settings) { 
     jqxhrs.push(jqxhr); 
    } 

    function unregisterJqxhr(event, jqxhr, settings) { 
     var idx = $.inArray(jqxhr, jqxhrs); 
     jqxhrs.splice(idx, 1); 
    } 

    $(document).ajaxSend(registerJqxhr); 
    $(document).ajaxComplete(unregisterJqxhr); 
}; 
+0

यह बहुत अच्छा काम करता है। आपका AJAX 'त्रुटि' फ़ंक्शन अभी भी निरस्त करने के लिए बुलाया जाएगा, इसलिए यदि आप कंसोल त्रुटियों को लॉग कर रहे हैं, तो 'textStatus! =' Abort'' के लिए परीक्षण करना सुनिश्चित करें ... – dhc

+0

मैंने इसका नवीनतम संस्करण जोड़ा है । मूल कोड में थोड़ी देर() लूप था और जब कोई एक्सएचआर ऑब्जेक्ट नहीं छोड़ा गया था तब केवल बाहर निकला था। हालांकि, यह सूची में शून्य xhr प्रविष्टियां पायेगी, और कुछ मामलों में त्रुटि होगी। – yourpublicdisplayname

संबंधित मुद्दे