Problemas com o getJSON do jQuery usando arquivos locais no Chrome

Eu tenho uma página de teste muito simples que usa solicitações XHR com os methods $ .getJSON e $ .ajax do jQuery. A mesma página funciona em algumas situações e não em outras. Especificamente, não funciona no Chrome no Ubuntu.

Estou testando no Ubuntu 9.10 com o Chrome 5.0.342.7 beta e no Mac OSX 10.6.2 com o Chrome 5.0.307.9 beta.

  • Funciona corretamente quando os arquivos são instalados em um servidor web do Ubuntu / Chrome e Mac / Chrome ( experimente aqui ).
  • Ele funciona corretamente quando os arquivos são instalados no disco rígido local no Mac / Chrome (acessado com file: /// …).
  • FALHA quando os arquivos são instalados no disco rígido local no Ubuntu / Chrome (access com o arquivo: /// …).

O pequeno conjunto de 3 arquivos pode ser baixado em um arquivo tar / gzip aqui: http://issues.tauren.com/testjson/testjson.tgz

Quando funciona, o console do Google Chrome dirá:

XHR finished loading: "http://issues.tauren.com/testjson/data.json". index.html:16Using getJSON index.html:21 Object result: "success" __proto__: Object index.html:22success XHR finished loading: "http://issues.tauren.com/testjson/data.json". index.html:29Using ajax with json dataType index.html:34 Object result: "success" __proto__: Object index.html:35success XHR finished loading: "http://issues.tauren.com/testjson/data.json". index.html:46Using ajax with text dataType index.html:51{"result":"success"} index.html:52undefined 

Quando isso não funcionar, o console do Chrome mostrará isso:

 index.html:16Using getJSON index.html:21null index.html:22Uncaught TypeError: Cannot read property 'result' of null index.html:29Using ajax with json dataType index.html:34null index.html:35Uncaught TypeError: Cannot read property 'result' of null index.html:46Using ajax with text dataType index.html:51 index.html:52undefined 

Observe que nem sequer mostra as solicitações XHR, embora o manipulador de sucesso seja executado. Eu juro que isso estava funcionando anteriormente no Ubuntu / Chrome, e estou preocupado que algo tenha sido bagunçado. Eu já desinstalei e reinstalei o Chrome, mas isso não ajudou.

Alguém pode testá-lo localmente no seu sistema Ubuntu e me dizer se você tem algum problema? Note que parece estar funcionando bem no Firefox.

Este é um problema conhecido com o Chrome.

Aqui está o link no bug tracker:

Problema 40787: arquivos locais não são carregados com o Ajax

Outra maneira de fazer isso é iniciar um servidor HTTP local em seu diretório. No Ubuntu e MacOs com o Python instalado, é um one-liner.

Vá para o diretório que contém seus arquivos da web e:

 python -m SimpleHTTPServer 

Em seguida, conecte-se a http: // localhost: 8000 / index.html com qualquer navegador da Web para testar sua página.

No Windows, o Chrome pode estar instalado na sua pasta AppData:

“C: \ Usuários \\ AppData \ Local \ Google \ Chrome \ Application”

Antes de executar o comando, verifique se todas as janelas do Chrome estão fechadas e não estão em execução. Ou o parâmetro da linha de comando não seria efetivo.

 chrome.exe --allow-file-access-from-files 

Você pode colocar seu json no arquivo js e salvá-lo na variável global. Não é asynchronous, mas pode ajudar.

Uma maneira adicional de contornar o problema é aproveitando os methods sandbox de segurança Local e SomenteInterface externos do Flash Player. É possível solicitar JavaScript para que um aplicativo Flash seja publicado usando a checkbox de proteção de segurança Local Only para carregar o arquivo do disco rígido, e o Flash pode passar os dados de volta para o JavaScript pela class ExternalInterface do Flash. Eu testei isso no Chrome, FF e IE9, e funciona bem. Eu ficaria feliz em compartilhar o código, se alguém estiver interessado.

EDIT: Eu comecei um projeto google code (irônico?) Para a implementação: http://code.google.com/p/flash-loader/

@Mike No Mac, digite isso no Terminal:

 open -b com.google.chrome --args --disable-web-security 

Este código funcionou bem com sheet.jsonlocally com synchronization de navegador como o servidor local. -Mas quando no meu servidor remoto eu tenho um 404 para o arquivo sheet.json usando o Chrome. Funcionou bem no Safari e no Firefox. – Alterei o nome sheet.json para sheet.JSON. Então funcionou no servidor remoto. Alguém mais tem essa experiência?

 getthejason = function(){ var dataurl = 'data/sheet.JSON'; var xhr = new XMLHttpRequest(); xhr.open('GET', dataurl, true); xhr.responseType = 'text'; xhr.send(); console.log('getthejason!'); xhr.onload = function() { ..... }