Я изучаю JavaScript, и теперь я застреваю в проблеме, которую я не понимаю. Эта проблема связана с jQuery.get, CORS, jQuery.getJSON и JSONP.
Скажем, что я пишу html файл с некоторыми скриптами, которые обращаются к URL-адресу с некоторым содержимым JSON. Файл html находится в моей локальной файловой системе и выглядит следующим образом:
<!DOCTYPE html>
<head>
<title>Test</title>
<script src = "test.js"
charset = "UTF-8"></script>
<script src = "jquery/jquery-1.9.1.js"
charset = "UTF-8"></script>
</head>
<body>
<h1>Test</h1>
<script type="text/javascript">
queryAuctionFiles('eu', 'tyrande');
</script>
</body>
Функция queryAuctionFiles
, вызываемая в теге body script, выглядит следующим образом:
// File: test.js
function queryAuctionFiles(realm, server)
{
var url = 'http://' +
realm +
'.battle.net/api/wow/auction/data/' +
server;
jQuery.get(url, function(data)
{
alert( "Eureka!" );
});
}
Открыв html с помощью браузера Chrome (V 32.0.1700.76 м), возникает следующая ошибка:
XMLHttpRequest не может загрузить http://eu.battle.net/api/wow/auction/data/tyrande. В запрошенном ресурсе нет заголовка "Access-Control-Allow-Origin". Поэтому исходный 'null' не допускается.
В результате поиска я узнал, что эта ошибка объясняется тем, что сбор ресурсов из какого-либо домена (моей локальной файловой системы) другому (eu.battle.net) запрещен по соображениям безопасности.
Я также прочитал, что эти запросы на междоменные запросы могут быть достигнуты с помощью CORS, но если Im не ошибается, этот материал CORS должен быть включен по обе стороны петиции; в моем случае: мой Chrome должен поддерживать CORS, и eu.battle.net должен включить его, как я могу узнать, поддерживает ли какой-либо домен CORS?
Ища решение для моей проблемы, Ive нашел о методе jQuery.getJSON, поэтому Ive дал ему попробовать, но результат был тот же, следующий код:
jQuery.getJSON(url, function(data)
{
alert( "Eureka!" );
});
Производит ту же ошибку No 'Access-Control-Allow-Origin', во-первых, я думал, что ошибка возникает, потому что данный url не является файлом JSON, но это, без сомнения, перекрестная доменная ошибка. Когда я думал о сдаче, я читал о JSONP и о том, как он управляется jQuery:
Если URL-адрес содержит строку "callback =?" (или аналогично, как определено API-интерфейсом на стороне сервера), вместо этого запрос обрабатывается как JSONP.
Итак, я сделал следующее изменение:
jQuery.getJSON(url + '?callback=?', function(data)
{ //^~~~~~~~~~~~~
alert( "Eureka!" );
});
И после этого я получаю другую ошибку:
Uncaught SyntaxError: Неожиданный токен:
И, имя файла, где отмечен синтаксический знак, является tyrande в строке 1, содержимое этого файла тирана выглядит следующим образом:
{"files":[{"url":"http://eu.battle.net/auction-data/d5357dc91898b3f78edfd1fbbe8867e8/auctions.json","lastModified":1390475765000}]}
Это содержимое - это вход, который я ожидал в анонимной функции, переданной как второй параметр getJSON!
Похоже, что getJSON загрузил файл с именем tyrande, из предоставленного url, а затем eval()
его содержимое, это содержимое является входом JSON и, следовательно, не является допустимой строкой JavaScript для оценки.
Теперь, когда я подробно объяснил, что я пробовал, и, зная мою цель, прошу:
eval()
uated?Спасибо за внимание
Это невозможно. Перекрестная политика домена не позволит вам получать файл из другого домена.
jQuery.getJSON
с "callback=?"
дополнение по крайней мере доступ к удаленному содержимому?