2011-01-12 1 views
5

Не следует ли следовать запросу AJAX с работой JQuery?Как запросить API-интерфейс Facebook с помощью JSONP

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

Я определил функцию обратного вызова с именем onLoadJSONP.

Но Chrome дает мне типичную Same-Origin-политика ошибку:

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, и пытались использовать XMLHttpRequest для захвата данных ... которые не выполняются из-за одного и того же ограничения политики происхождения.

+0

Работает ли это в IE? (Это работает для Chrome и Firefox для меня, но не работает в IE). Благодарю. – user1055761

+0

Какая ошибка вы получаете в IE? –

+0

это дает мне ошибку «нет транспорта» при отладке через отладчик IE. У вас есть работа над IE? Благодаря ! – user1055761

4

Это должно быть «callback =?» и затем вы определяете обратный вызов как последний параметр запроса.

$.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

Простой добавить следующий код JavaScript, прежде чем делать какие-либо Междоменные 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(); 
     } 
    }; 
    } 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^