Простой AJAX JS отлично работает локально в Safari, выходит из строя на сервере и в Firefox (проблема с evalJSON())?
-
07-07-2019 - |
Вопрос
Я написал скрипт, который опрашивает Twitter с помощью AJAX-методов Prototype, получает результаты в формате JSON, оценивает их, а затем обновляет div форматированными твитами.При тестировании все работало нормально (Safari 4.0.3 на компьютере с OS 10.6.1), пока я не загрузил скрипт на сервер, и он не дал сбой.Скрипт содержал все элементы на стороне клиента и ссылался на один и тот же Prototype.js файл, поэтому я не могу понять, почему он работал локально, а не удаленно.
Я урезал скрипт до его голой сути - просто вернул последний твит на моей временной шкале в окно предупреждения - и работает / прерывается таким же образом, как описано выше, а также в Firefox.Я уверен, что совершаю глупую ошибку, но не могу найти ошибку в своих действиях.
Вот вся моя страница целиком.Работает локально, а не на сервере или в Firefox:
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script>
<script type="text/javascript" charset="utf-8">
document.observe("dom:loaded", function(){
var tweetAddress = "http://twitter.com/status/user_timeline/hellbox.json?count=1";
new Ajax.Request( tweetAddress, {
method: 'get',
onSuccess: function (transport) {
var tweets = transport.responseText.evalJSON();
alert(tweets[0].text);
}
});
});
</script>
</head>
<body>
</body>
</html>
Решение
Вы используете " та же политика происхождения " стены. Вы не можете выполнить запрос AJAX на twitter.com со страницы, загруженной из другого домена.
Попробуйте JSONP вместо JSON.
http: //jquery-howto.blogspot .com / 2009/04 / твиттер-jsonjsonp-апи-url.html
В JSON тег <script>
будет вставлен на вашу страницу, и впоследствии загруженный скрипт вызовет функцию обратного вызова. Нет ограничений домена с загрузкой сценариев из внешних доменов.
Другие советы
Если я не ошибаюсь, вы пытаетесь выполнить Ajax-запрос к twitter.com
домен.
Если само ваше приложение не размещено на этом сервере twitter.com
домен, вы не можете выполнять к нему Ajax-запросы :вы можете выполнять Ajax-запросы только к домену, на котором размещено ваше приложение.
Это означает, что если ваш веб-сайт находится на "www.mydomain.com
", вы можете отправлять Ajax-запросы только в "www.mydomain.com
".
Нет "test.mydomain.com
" ни "www.anotherdomain.com
"
Это происходит из-за ограничения безопасности, реализованного в веб-браузерах, называемого Политика Того же Происхождения (цитирую) :
политика разрешает скриптам, запущенным на страницах, происходящих с одного сайта , получать доступ к методам и свойствам друг друга без каких-либо конкретных ограничений, но запрещает доступ к большинству методов и свойств на страницах разных сайтов.
Возможным решением этой проблемы могло бы быть использование прокси-сервера в вашем собственном домене, который twitter.com ;таким образом, ваш веб-сайт мог бы отправлять запросы на ваш домен, и они фактически были бы повторно отправлены в twitter ;таким образом, никаких проблем с SOP нет.
В качестве примечания, Когда вы говорите "это работало локально". :вы имеете в виду, что у вас есть веб-сервер на вашем локальном компьютере, и он работал при обслуживании с этого сервера?В данном случае это не должно было сработать.
В вы имеете в виду "Открытие файла локально, с помощью чего-то вроде file://.../myfile.html" в адресной строке браузера - ну, может быть, у Safari нет такой же политики происхождения для локальных документов?
(Не уверен насчет этого - просто такая возможность есть)