Простой AJAX JS прекрасно работает локально в Safari, не работает на сервере и в Firefox (проблема с evalJSON ())? - PullRequest
0 голосов
/ 17 сентября 2009

Я написал скрипт, который опрашивает Twitter с помощью методов AJAX Prototype, получает результаты JSON, проверяет их, а затем обновляет div с помощью отформатированных твитов. В тестировании все работало нормально (Safari 4.0.3 на компьютере с ОС 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>

Ответы [ 2 ]

1 голос
/ 17 сентября 2009

Вы попадаете в стену "политики одинакового происхождения". Вы не можете выполнить запрос AJAX на twitter.com со страницы, загруженной из другого домена.

Попробуйте JSONP вместо JSON:

http://jquery -howto.blogspot.com / 2009/04 / твиттер-jsonjsonp-апи-url.html

При использовании JSON тег <script> будет добавлен на вашу страницу, и впоследствии загруженный скрипт вызовет функцию обратного вызова. Для загрузки сценариев из внешних доменов нет никаких ограничений.

0 голосов
/ 17 сентября 2009

Если я не ошибаюсь, вы пытаетесь выполнить Ajax-запрос к домену twitter.com.

Если ваше приложение само не размещено в этом домене twitter.com, вы не можете делать запросы Ajax к нему: вы можете только выполнять запросы Ajax к домену, в котором размещено ваше приложение.

Это означает, что если ваш веб-сайт находится на "www.mydomain.com", вы можете отправлять только запросы Ajax на "www.mydomain.com".
Не "test.mydomain.com" и не "www.anotherdomain.com"

Это связано с ограничением безопасности, реализованным в веб-браузерах, которое называется Same Origin Policy (цитирование) :

политика разрешает запуск сценариев страницы с того же сайта чтобы получить доступ к методам друг друга и свойства без конкретного ограничения - но препятствует доступу большинство методов и свойств по всему страницы на разных сайтах.

Возможное решение этой проблемы может заключаться в использовании прокси на вашем собственном домене, который будет использовать прокси для twitter.com; таким образом, ваш веб-сайт может отправлять запросы на ваш домен, и они будут фактически пересылаться в твиттер; нет проблем с СОП, таким образом.


В качестве пояснения, когда вы говорите «он работал локально»: вы имеете в виду, что у вас есть локальный веб-сервер, и он работал, когда обслуживался с этого сервера? В этом случае это не должно было сработать.

Вы имеете в виду «Открытие файла локально, с чем-то вроде file: //.../myfile.html» в адресной строке браузера - ну, может, в Safari нет одинаковой политики происхождения для локальных документов?
(Не уверен насчет этого - просто возможность)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...