2010-03-29 27 views
47

Tengo un very simple test page que usa solicitudes XHR con los métodos $ .getJSON y $ .ajax de jQuery. La misma página funciona en algunas situaciones y no en otras. Específicamente, no funciona en Chrome en Ubuntu.Problemas con jQuery getJSON usando archivos locales en Chrome

Estoy probando en Ubuntu 9.10 con Chrome 5.0.342.7 beta y Mac OSX 10.6.2 con Chrome 5.0.307.9 beta.

  • Funciona correctamente cuando los archivos están instalados en un servidor web desde Ubuntu/Chrome y Mac/Chrome (try it out here).
  • Funciona correctamente cuando los archivos están instalados en el disco duro local en Mac/Chrome (se accede con el archivo: /// ...).
  • Es FAILS cuando los archivos están instalados en el disco duro local en Ubuntu/Chrome (acceso con el archivo: /// ...).

El pequeño conjunto de 3 archivos se pueden descargar en un archivo tar/gzip desde aquí: http://issues.tauren.com/testjson/testjson.tgz

Cuando funciona, la consola de Chrome dirán:

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 

Cuando doesn no funciona, la consola de Chrome mostrará esto:

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 ni siquiera muestra el Solicitudes XHR, aunque se ejecuta el controlador de éxito. Juro que esto estaba funcionando previamente en Ubuntu/Chrome, y estoy preocupado de que algo se haya estropeado. Ya desinstalé y reinstalé Chrome, pero eso no ayudó.

¿Alguien puede probarlo localmente en su sistema Ubuntu y decirme si tiene algún problema? Tenga en cuenta que parece estar funcionando bien en Firefox.

+3

Supongo que Chrome aplica indebidamente la política de origen idéntico y no emite solicitudes pensando que es un dominio diferente. Intente iniciar Chrome a través de la línea de comando usando '--disable-web-security' y vea si funciona? –

+0

@Nick: gracias, voy a intentarlo para ver si me ayuda. – Tauren

+1

Me encontré con la misma situación, y '--disable-web-security' funcionó, ¡gracias! –

Respuesta

29

Este es un problema conocido con Chrome.

Aquí está el enlace en el seguimiento de errores:

Issue 40787: Local files doesn't load with Ajax

+1

fusionado y superado^H^H^H^discutido en: http://code.google.com/p/chromium/issues/detail?id=47416. –

0

@ Mike En Mac, escriba esto en la Terminal:

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

disable-web-security suena como una terrible solución ... no lo recomendaría debido a los riesgos de seguridad. –

+7

Use esto para OSX en su lugar: abrir/Aplicaciones/Google \ Chrome.app --args --allow-file-access-from-files – donohoe

+0

El comando de michael no funcionó para mí. En su lugar, utilicé esta línea de comandos:/Applications/Google \ Chrome.app/Contents/MacOS/Google \ Chrome --allow-file-access-from-files & – stackoverflowuser2010

12

En Windows, Chrome podría ser instalado en la carpeta de datos de programa:

"C: \ Users \\ AppData \ Local \ Google \ Chrome \ Application"

Antes de ejecutar el comando, asegúrese de que todas sus ventanas de Chrome sean cerradas y no estén en ejecución. O bien, el param de línea de comando no sería efectivo.

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

Esto me funcionó (en Windows 7). Primero, fui al directorio indicado arriba, luego cambié + clic derecho sobre el ícono de Google Chrome, selecciono "Abrir línea de comando aquí" desde el menú de contexto y finalmente pego el código de línea de comando dado arriba. Chrome comenzó y mostró el contenido de la solicitud ajax a mi máquina local, según lo deseado. – edt

+0

Y ... Tienes que hacer esto cada vez que abras Chrome: ((( – edt

+1

esto "toda tu ventana de Chrome está cerrada" es muy importante! – rluks

37

Otra forma de hacerlo es iniciar un servidor HTTP local en su directorio. En Ubuntu y MacOs con Python instalado, es de una sola línea.

Vaya al directorio que contiene sus archivos web, y:

python -m SimpleHTTPServer 

Luego conecte a http://localhost:8000/index.html con cualquier navegador web para probar su página.

+1

¡Eso es increíble! Gracias, Sébastien! –

+1

Todavía recibo 'XMLHttpRequest no puede cargar _url_. Origen http: // localhost: 8000 no está permitido por Access-Control-Allow-Origin. – bafromca

+1

no funcionó para mí tampoco en OS X – Danny

0

Una forma adicional de evitar el problema es aprovechando la zona de pruebas de seguridad Local Only de Flash Player y los métodos ExternalInterface. Uno puede tener JavaScript para solicitar que se publique una aplicación Flash utilizando el entorno limitado de seguridad Local Only para cargar el archivo desde el disco duro, y Flash puede pasar los datos a JavaScript mediante la clase ExternalInterface de Flash. He probado esto en Chrome, FF e IE9, y funciona bien. Me encantaría compartir el código si alguien está interesado.

EDIT: he comenzado un código de Google Project (irónico?) Para la implementación: http://code.google.com/p/flash-loader/

2

Usted puede colocar su JSON a js y guardarlo en la variable global. No es asincrónico, pero puede ayudar.

0

Este código funcionó bien con sheet.jsonlocally con browser-sync como el servidor local. -Pero cuando estaba en mi servidor remoto obtuve un 404 para el archivo sheet.json usando Chrome. Funcionó bien en Safari y Firefox. -Cambió el nombre sheet.json a sheet.JSON. Luego funcionó en el servidor remoto. ¿Alguien más tiene esta experiencia?

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() { 
..... 
} 
Cuestiones relacionadas