Problemi con jQuery getJSON che utilizza file locali in Chrome

Ho una pagina di test molto semplice che usa le richieste XHR con i metodi $ .getJSON e $ .ajax di jQuery. La stessa pagina funziona in alcune situazioni e non in altre. Nello specifico, non funziona su Chrome su Ubuntu.

Sto testando su Ubuntu 9.10 con Chrome 5.0.342.7 beta e Mac OSX 10.6.2 con Chrome 5.0.307.9 beta.

  • Funziona correttamente quando i file sono installati su un server web sia da Ubuntu / Chrome e Mac / Chrome ( provalo qui ).
  • Funziona correttamente quando i file vengono installati sul disco rigido locale in Mac / Chrome (a cui si accede con file: /// …).
  • NON FAIL quando i file sono installati sul disco rigido locale in Ubuntu / Chrome (accesso con file: /// …).

Il piccolo set di 3 file può essere scaricato in un file tar / gzip da qui: http://issues.tauren.com/textjson/textjson.tgz

Quando funziona, la console di Chrome dirà:

XHR finished loading: "http://issues.tauren.com/textjson/data.json". index.html:16Using getJSON index.html:21 Object result: "success" __proto__: Object index.html:22success XHR finished loading: "http://issues.tauren.com/textjson/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/textjson/data.json". index.html:46Using ajax with text dataType index.html:51{"result":"success"} index.html:52undefined 

Quando non funziona, la console di Chrome mostrerà questo:

 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 

Si noti che non mostra nemmeno le richieste XHR, sebbene venga eseguito il gestore di successo. Giuro che in precedenza funzionava su Ubuntu / Chrome, e sono preoccupato che qualcosa si sia incasinato. Ho già disinstallato e reinstallato Chrome, ma ciò non ha aiutato.

Qualcuno può provarlo localmente sul tuo sistema Ubuntu e dirmi se hai qualche problema? Si noti che sembra funzionare bene in Firefox.

Questo è un problema noto con Chrome.

Ecco il link nel bug tracker:

Problema 40787: i file locali non vengono caricati con Ajax

Un altro modo per farlo è avviare un server HTTP locale nella tua directory. Su Ubuntu e MacOs con Python installato, è un one-liner.

Vai alla directory contenente i tuoi file web e:

 python -m SimpleHTTPServer 

Quindi connettiti a http: // localhost: 8000 / index.html con qualsiasi browser web per testare la tua pagina.

Su Windows, Chrome potrebbe essere installato nella tua cartella AppData:

“C: \ Users \\ AppData \ Local \ Google \ Chrome \ Application”

Prima di eseguire il comando, assicurati che tutte le windows di Chrome siano chiuse e non funzionino altrimenti. Oppure, il parametro della riga di comando non sarebbe efficace.

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

È ansible inserire il file json in js e salvarlo nella variabile globale. Non è asincrono, ma può aiutare.

Un altro modo per aggirare il problema è sfruttando i metodi Sandbox di sicurezza locale e Solo interfaccia esterna di Flash Player. È ansible richiedere a JavaScript un’applicazione Flash pubblicata utilizzando la sandbox di sicurezza Solo locale per caricare il file dal disco rigido e Flash può trasferire i dati su JavaScript tramite la class ExternalInterface di Flash. Ho provato questo in Chrome, FF e IE9, e funziona bene. Sarei felice di condividere il codice se qualcuno fosse interessato.

EDIT: ho avviato un progetto google code (ironico?) Per l’implementazione: http://code.google.com/p/flash-loader/

@Mike On Mac, digita questo nel Terminale:

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

Questo codice ha funzionato bene con sheet.jsonlocally con sync browser come server locale. -Ma quando sul mio server remoto ho ottenuto un 404 per il file sheet.json utilizzando Chrome. Ha funzionato bene in Safari e Firefox. -Cambiato il nome sheet.json to sheet.JSON. Quindi ha funzionato sul server remoto. Qualcun altro ha questa esperienza?

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