2011-12-14 5 views
1

Я пытаюсь извлечь данные, используя метод jQuery getJSON для всех доменов. Я имею установку тест на JS FIDDLE здесь:getJSON не вытягивает данные по доменам

http://jsfiddle.net/kbPV7/1/

Я действительно понятия не имею, почему это не работает. Если я загружаю этот файл в том же домене или локально использую feeTest.html, код работает.

Однако, если я загружаю или использую поистине предназначенный URL, фид не работает.

Кроме того, если я использую .ajax в том же домене, он работает. Но я понял, что .ajax не работает в разных доменах, и для этого используется .getJSON.

Спасибо за помощь!

+1

Нет, '.getJSON' предназначен для извлечения данных JSON из того же домена. jQuery автоматически проанализирует данные в структуре данных JavaScript. Если вы хотите совершать перекрестные вызовы, вы должны использовать JSONP (который вы можете использовать '.getJSON'), который должен поддерживаться сервером. –

ответ

0

.getJSON() является сокращением до .ajax() с предварительно настроенными параметрами. См. documentation.

Данные в URL-адресе находятся в формате JSON и не поддерживаются междоменным. Они должны быть возвращены в формате JSONP, что означает, что они должны иметь возможность помещать данные в указанную функцию обратного вызова.

Вы должны либо изменить службу для использования JSONP, либо указать параметр обратного вызова или использовать другие способы доступа к службе.

Пример использования YQL для доступа к данным:

$.ajax({ 
    url: 'http://query.yahooapis.com/v1/public/yql', 
    data: { 
    q: 'select * from json where url="http://www.corporatereport.com/SampleSites/rockwellCollins/mockup5/feedTest.html"', 
    format: 'json' 
    }, 
    dataType: 'JSONP', 
    success: function(data) { 
    // this is the XML in JSON format 
    console.log(data.query.results.json.news); 

    // example - display list of titles 
    var titles = $.map(data.query.results.json.news, function(news) { 
     return '<li>' + news.t + '</li>'; 
    }); 
    $('<ul />', { html: titles.join('') }).appendTo('body'); 
    } 
}); 

HERE является кодом.

3

$.getJSON не разрешает same origin policy restriction, однако JSONP не делает. Но для этого требуется, чтобы сервер отправил обратный вызов, обертывая данные json.

0

Вот случай, когда у вас есть доступ к двум различным доменам, которые вы можете контролировать, и вам нужно сделать вызов в режиме crossdomain. Таким образом, это случай, когда вы не можете этого избежать, и вы не можете контролировать возврат данных в формате JSONP.

var script = document.createElement('script'); 
script.type = "text/javascript";   
script.src='path to crossdomain source.js'; 
document.getElementsByTagName("head")[0].appendChild(script); 

lookupInterval = setInterval("function_to_call()", 1000); 

var lookupCounter=0; 

function function_to_call(){ 
    //give up after 5 times 
    if(++lookupCounter == 5) 
     return clearInterval(lookupInterval); 

    try{ 
     var cities = GEO_DATA_2011_11_28.cities.city; 

     //since we found our data, let's clean the interval call 
     return clearInterval(lookupInterval) 
    } 
    catch(e){ 
     //do nothing, we are actually controlling the situation with the if condition at the beginning 
    } 
} 

Мы определяем наши данные в удаленном JS файл, как вар GEO_DATA_2011_11_28 = {} в формате JSON. Хитрость заключается в том, что мы динамически вставляем файл сценария в головную часть нашего HTML. Поскольку блоки скриптов могут без проблем загружать скрипты crossdomain, мы можем сделать это отложенным образом. Учитывая, что могут возникнуть задержки загрузки скрипта, мы вызываем вызов функции, которая проверяет данные, которые мы хотим получить.

Это решение было необходимо, потому что не было возможности отправлять данные в JSONP, поэтому мы зависели от чтения простых js-файлов.

0

Hy, это противоречит той же самой политике происхождения и, как правило, не допускается.
В любом случае есть плагин для jQuery, который использует Yahoo Query Language YQL. Я использовал его в своих проектах до сих пор, и он работал нормально.
Вот ссылка на учебник http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

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