JSONP

2011-01-12 17 views
5

के साथ फेसबुक ग्राफ़ एपीआई से पूछताछ कैसे करें JQuery काम के साथ AJAX अनुरोध का पालन नहीं करना चाहिए?JSONP

$.getJSON('https://graph.facebook.com/138654562862101/feed?callback=onLoadJSONP'); 

मैं onLoadJSONP नाम के एक कॉलबैक समारोह को परिभाषित किया है।

लेकिन क्रोम मुझे एक ठेठ एक ही-उत्पत्ति-नीति त्रुटि देता है:

XMLHttpRequest cannot load https://graph.facebook.com/138654562862101/feed?callback=onLoadJSONP . Origin null is not allowed by Access-Control-Allow-Origin.

मैंने सोचा था कि JSONP कि चारों ओर से काम किया, क्या मैं गलत कर रहा हूँ?

उत्तर

17

jQuery detects JSONP desired behaviorविशेष रूप से callback=? साथ है, तो आप बिल्कुल कि, तो समारोह आप इसे हैंडल करना चाहते उत्तीर्ण करनी होगी। कोई बाहर परिवर्तन करके, आप ऐसा कर सकता है:

$.getJSON('https://graph.facebook.com/138654562862101/feed?callback=?', onLoadJSONP); 

यह callback=? अभी भी कॉलबैक सीधे रूप में अपने फ़ंक्शन का उपयोग करके काम करने के लिए खोज की अनुमति देता है। पहले, यह पता नहीं लगा रहा था कि आप एक JSONP fetch चाहते थे, और डेटा को पकड़ने के लिए XMLHttpRequest का उपयोग करने का प्रयास कर रहा था ... जो मूल उत्पत्ति प्रतिबंध के कारण विफल रहता है।

+0

क्या यह आईई में भी काम करता है? (यह मेरे लिए क्रोम और फ़ायरफ़ॉक्स के लिए काम कर रहा है, लेकिन आईई में विफल रहता है)। धन्यवाद। – user1055761

+0

आईई में आपको क्या त्रुटि मिल रही है? –

+0

यह आईई डीबगर के माध्यम से डीबगिंग करते समय मुझे 'कोई परिवहन' त्रुटि नहीं देता है। क्या आपको यह आईई पर काम मिल गया है? धन्यवाद ! – user1055761

4

इसे "कॉलबैक =" होना चाहिए? और फिर आप कॉलबैक को अनुरोध के अंतिम पैरामीटर के रूप में परिभाषित करते हैं।

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", 
    { 
    tags: "cat", 
    tagmode: "any", 
    format: "json" 
    }, 
    function(data) { 
    $.each(data.items, function(i,item){ 
     $("<img/>").attr("src", item.media.m).appendTo("#images"); 
     if (i == 3) return false; 
    }); 
    }); 
1

इससे पहले कि आप किसी भी क्रॉस-डोमेन AJAX फोन करना जावा स्क्रिप्ट कोड निम्नलिखित सरल ऐड।

jQuery.support.cors = true; 

$.ajaxTransport("+*", function(options, originalOptions, jqXHR) { 

    if(jQuery.browser.msie && window.XDomainRequest) { 

    var xdr; 

    return { 

     send: function(headers, completeCallback) { 

      // Use Microsoft XDR 
      xdr = new XDomainRequest(); 

      xdr.open("get", options.url); 

      xdr.onload = function() { 

       if(this.contentType.match(/\/xml/)){ 

        var dom = new ActiveXObject("Microsoft.XMLDOM"); 
        dom.async = false; 
        dom.loadXML(this.responseText); 
        completeCallback(200, "success", [dom]); 

       }else{ 

        completeCallback(200, "success", [this.responseText]); 

       } 

      }; 

      xdr.ontimeout = function(){ 
       completeCallback(408, "error", ["The request timed out."]); 
      }; 

      xdr.onerror = function(){ 
       completeCallback(404, "error", ["The requested resource could not be found."]); 
      }; 

      xdr.send(); 
     }, 
     abort: function() { 
      if(xdr)xdr.abort(); 
     } 
    }; 
    } 
}); 
संबंधित मुद्दे