Вам нужно посмотреть на JSONP .
По сути, при попытке загрузить JSON из другого домена происходит сбой, поскольку существует граница домена, которую вы не можете пересечь. Чтобы избежать этого, вы должны PAD it (P в JSONP). Дополнение к нему - это, по сути, завершение его в вызове функции (где имя функции находится на вашем клиенте.) Например, «нормальный» ответ JSON (например, getjson.php):
{foo:'bar'}
JSON с обратным вызовом parseJSON
становится (скажем, например, getjson.php? Callback = parseJSON):
parseJSON({foo:'bar'})
Обратите внимание, как значение, указанное в callback , становится именем функции, в которую теперь включен ваш ответ JSON.
Тогда ваш клиент захочет передать его в parseJSON
, функцию, которая существует на вашем клиенте (которую вы определили). jQuery (и другие библиотеки) пытаются позаботиться об этом за вас, сгенерировав некоторую «случайную» функцию, а затем отправив ответ обратно через ваш оригинальный обратный вызов (все это делается под капотом).
Если у вас есть контроль над страницей сервера, генерирующей JSON, реализуйте метод обратного вызова, чтобы вы могли указать, как JSON должен быть упакован, чтобы вы могли работать с ним на своем конце. (Это необходимо, только если вы имеете дело с данными из домена, отличного от страницы, на которой в данный момент находится клиент).
UPDATE
Чтобы в основном решить проблему, с которой вы столкнулись, вам нужно найти способ передать информацию JSON в вызов JSONP. Не зная, на каком языке находится ваш "page.json", вот логика псевдокода, которую он должен содержать:
if GET_VARIABLE("callback") is supplied
print GET_VARIABLE("callback") and an open parenthesis
print normal JSON data
print closing parenthesis
else
print normal JSON data
end if
Если вы решили жестко закодировать имя функции вместо того, чтобы разрешить указывать ее в URL как «обратный вызов», вам нужно запомнить это. В следующем примере давайте представим, что мы назвали его MyJSONPCallback
Теперь в вашем клиентском коде вы можете использовать его заранее:
$.ajax({
url: 'http://anotherdomain.com/page.json?format=json',
dataType: 'json',
jsonpCallback: 'MyJSONPCallback', // specify the callback name if you're hard-coding it
success: function(data){
// we make a successful JSONP call!
}
});