Simples AJAX JS funciona bem localmente no Safari, falha no servidor e no Firefox (problema com evalJSON ())?

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

Pergunta

Eu escrevi um script que as pesquisas Twitter através de métodos AJAX do Prototype, agarra resultados JSON, evals eles e, em seguida, atualiza uma div com os tweets formatados. Tudo funcionou bem em testes (Safari 4.0.3 em uma máquina OS 10.6.1) até que eu carreguei o script em um servidor e falhou. O roteiro teve todos os itens do lado do cliente e encaminhados para o mesmo arquivo Prototype.js, então eu não consigo descobrir por que ele estava trabalhando localmente, mas não remotamente.

Eu despojado o script para baixo a sua essência nua - apenas retornar o mais recente tweet no meu cronograma em uma caixa de alerta - e obras / quebras da mesma forma descrita acima, e também no Firefox. Eu tenho certeza que estou cometendo um erro boneheaded, mas não consegue encontrar o erro dos meus caminhos.

Aqui está a totalidade da minha página. Funciona localmente, não no servidor ou no 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>
Foi útil?

Solução

Você está batendo na parede "política de mesma origem". Você não pode executar uma solicitação AJAX para twitter.com partir de uma página que é carregado de outro domínio.

Tente JSONP em vez de JSON:

http: //jquery-howto.blogspot .com / 2009/04 / twitter-jsonjsonp-api-url.html

Com JSON, um tag <script> será injetado em sua página e, posteriormente, uma função de retorno de chamada será chamado pelo script carregado. Não há restrições de domínio com carga scripting de domínios externos.

Outras dicas

Se não me engano, você está tentando fazer uma solicitação do Ajax para o domínio twitter.com.

Se a aplicação em si não está hospedado nesse domínio twitter.com, você não pode fazer requisições Ajax a ele:. Você só pode fazer solicitações de AJAX para o domínio no qual o aplicativo está hospedado

Isto significa que se o site é sobre "www.mydomain.com", você só pode enviar requisições Ajax para "www.mydomain.com".
Not "test.mydomain.com" nem "www.anotherdomain.com"

Este é devido a uma restrição de segurança implementado em navegadores web, chamado política de mesma origem (citando) :

a política permite scripts de execução em páginas proveniente do mesmo local para acessar métodos do outro e Propriedades sem específico restrições - mas impede o acesso a a maioria dos métodos e propriedades através páginas em locais diferentes.

Uma possível solução para esse problema seria usar um proxy em seu próprio domínio, o que faria proxy para twitter.com; Desta forma, seu site pode enviar consultas para o seu domínio, e aqueles seria realmente Twitter enviou-re; nenhum problema com SOP, desta forma.


Como nota, Quando você diz "que estava trabalhando localmente": quer dizer que você tem um servidor web em sua máquina local, e foi trabalhar quando servido a partir desse servidor? Não deve ter trabalhado, no caso.

Em que você quer dizer "Abrir o arquivo localmente, com algo como file: //.../myfile.html" na barra de endereços do navegador - bem, talvez Safari não tem política de mesma origem para documentos locais?
(Não tenho certeza sobre isso - apenas uma possibilidade)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top