2012-03-02 12 views
7

फेंक जाएगी मैं jQuery के साथ सरल ऑटोसॉशन (स्वतः पूर्ण) प्लगइन बना रहा हूं। दुर्भाग्य से मुझे jsonp का उपयोग करना है। यह ठीक है और यह काम करता है, लेकिन जब मैं अनुरोध निरस्त कर रहा हूं तो यह त्रुटि फेंक देगा।jQuery JSONP अनुरोध को निरस्त करने से त्रुटि

Uncaught TypeError: Property 'jQuery171036404498340561986_1330693563756' of object [object Window] is not a function 

वहाँ कोड ठीक काम करता है json एक्सएमएल या अन्य अनुरोध के साथ

if(xhr) {xhr.abort()}; 
xhr = $.ajax({ 
    url: "someurl/getmedata", 
    type: 'get', 
    dataType: 'jsonp', 
    data: {q: "query"}, 
    success: function(results) {}, 
    error: function() {} 
}) 

क्लासिक तरीका है।

एनी सुझाव?

+0

यह सवाल पहले [jQuery के साथ बीच में बंद करें JSONP ajax अनुरोध] (का डुप्लिकेट है http://stackoverflow.com/questions/6472509/abort-jsonp-ajax- अनुरोध-साथ-jquery), हालांकि उस प्रश्न का सही उत्तर कभी नहीं दिया गया था और यह एक था। –

उत्तर

14

JSONPनहीं उपयोग XMLHTTPRequest करता है, लेकिन वास्तव में दस्तावेज़ के भीतर एक <script> टैग बना देता क्रॉस-डोमेन अनुरोध बनाने के लिए सक्षम होने के लिए।

आप बस JSONP अनुरोधों को निरस्त नहीं कर सकते हैं।

यह $.ajax() दस्तावेज में कहा गया है:

अजाक्स अनुरोध के कुछ प्रकार, इस तरह के रूप JSONP और क्रॉस-डोमेन अनुरोध, एक्सएचआर का उपयोग नहीं करते प्राप्त; उन मामलों में कॉलबैक को पास किए गए XMLHttpRequest और टेक्स्टस्टैटस पैरामीटर अपरिभाषित हैं।

jQuery 1.5+ के लिए के रूप में, पहले से $ .ajax (से एक्सएचआर वस्तु लौट रहा था), अब यह एक सुपरसेट jqXHR वस्तु जो एक्सएचआर वस्तु समाहित देता है।

जब परिवहन व्यवस्था XMLHttpRequest से कुछ अन्य है (उदाहरण के लिए, एक JSONP अनुरोध के लिए एक स्क्रिप्ट टैग) jqXHR वस्तु देशी एक्सएचआर कार्यक्षमता जहां संभव simulates।

तो यह एक वस्तु देता है लेकिन कुछ कार्यक्षमता वास्तव में उपलब्ध नहीं हैं, जैसे .abort()।


प्लगइन jQuery-JSONP संभावना मैन्युअल JSONP अनुरोध निरस्त करने के लिए की पेशकश करने लगता है। मैंने इसे स्वयं नहीं इस्तेमाल किया है, लेकिन यह कोशिश करने लायक है।

+0

ठीक है इसे प्राप्त करें। वैश्विक संदर्भ में लापता कार्य को संभालने का कोई और तरीका है? – Schovi

+1

मैंने प्लगइन [jquery-jsonp] (http://code.google.com/p/jquery-jsonp/) के लिए एक लिंक जोड़ा है जो jsonp अनुरोधों को निरस्त करने की संभावना प्रदान करता है। –

+0

धन्यवाद। मैं कोशिश करुंगा! – Schovi

4

jQuery JSONP को लागू करने के लिए <script> टैग का उपयोग करता है। आप स्क्रिप्ट टैग की लोडिंग को रोक नहीं सकते हैं।

0

सबसे पहले, कुछ अनुक्रमण तर्क का उपयोग करें। यह आपके अंतिम अनुरोध को पुराना लोगों पर आश्वस्त करेगा। यहां आपके पास example है।

इसके अलावा, आप इन $.ajax सेटिंग का लाभ उठा सकते हैं:

timeout: अनुरोध के अनुसार एक समय सीमा तय करने और अनुरोध चुपचाप असफल को रोकने के।

beforeSend: कॉल करने से पहले कुछ शर्तों को मान्य करें। सहायक अनुक्रम सहायक।

As of jQuery 1.5, the beforeSend option will be called regardless of the type of request. 

उदाहरण:

function updateResults() { 

    // Init counter & record current request 
    if (!window.reqSeq) window.reqSeq = 0; 
    window.reqSeq +=1; 
    var thisRequest = window.reqSeq; 

    $.ajax({ 
    url: [..], 
    crossDomain: true, 
    contentType: "application/json", 
    dataType: 'jsonp', 
    timeout: 5000, // give 5 seconds of margin 
    data: { [..] }, 
    beforeSend: function() { 
     if(thisRequest < window.reqSeq) { 
     return false; 
     } 
    }, 
    success: function(data, textStatus, jqXHR) { 
     if(thisRequest < window.reqSeq) { 
     return; 
     } 
     else print(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // it'll be called on timeout (error) and beforeSend (abort) 
     print(textStatus); 
    } 
    }); 

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