Простой AJAX JS отлично работает локально в Safari, выходит из строя на сервере и в Firefox (проблема с evalJSON())?

StackOverflow https://stackoverflow.com/questions/1435420

Вопрос

Я написал скрипт, который опрашивает 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 нет такой же политики происхождения для локальных документов?
(Не уверен насчет этого - просто такая возможность есть)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top