2010-03-29 17 views
47

Ho un very simple test page che utilizza 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.Problemi con jQuery getJSON utilizzando file locali in Chrome

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 vengono installati su un server Web sia da Ubuntu/Chrome e Mac/Chrome (try it out here).
  • Funziona correttamente quando i file vengono installati sul disco rigido locale in Mac/Chrome (a cui si accede con file: /// ...).
  • E FAIL quando i file vengono 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/testjson/testjson.tgz

Quando funziona, la console 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 si doesn 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 il 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 proprio sistema Ubuntu e dirmi se ha qualche problema? Si noti che sembra funzionare bene in Firefox.

+3

La mia ipotesi sarebbe Chrome applicare inappropriatamente la politica della stessa origine e non emettere richieste pensando che sia un dominio diverso. Prova a lanciare chrome tramite la riga di comando usando '--disable-web-security' e vedi se funziona? –

+0

@Nick: grazie, farò una prova e vedere se aiuta. – Tauren

+1

Mi sono imbattuto nella stessa situazione, e '--disable-web-security' ha funzionato, grazie! –

risposta

29

Questo è un problema noto con Chrome.

Ecco il link nel bug tracker:

Issue 40787: Local files doesn't load with Ajax

+1

uniti e ulteriormente battuti^H^H^H^discussi in: http://code.google.com/p/chromium/issues/detail?id=47416. –

0

@ Mike Su Mac, digitare questo nel terminale:

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

disable-web-security suona come una soluzione terribile ... non lo consiglierei a causa di rischi per la sicurezza. –

+7

Usa questo per OSX invece: apri/Applicazioni/Google \ Chrome.app --args --allow-file-access-from-files – donohoe

+0

Il comando di michael non ha funzionato per me. Invece, ho usato questa riga di comando:/Applicazioni/Google \ Chrome.app/Contents/MacOS/Google \ Chrome --allow-file-access-from-files & – stackoverflowuser2010

12

In Windows, Chrome potrebbe essere installato nella cartella AppData:

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

Prima di eseguire il comando, assicurarsi che tutte le finestre di Chrome siano chiuse e non altrimenti in esecuzione. Oppure, il parametro della riga di comando non sarebbe efficace.

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

Questo ha funzionato da me (su Windows 7). Per prima cosa, sono passato alla directory sopra elencata, quindi shift + tasto destro del mouse sull'icona di Google Chrome, selezionare "Apri riga di comando qui" dal menu di scelta rapida e infine incollare il codice della riga di comando indicato sopra. Chrome ha avviato e visualizzato il contenuto di una richiesta Ajax sul mio computer locale come desiderato. – edt

+0

E ... Devi fare questo ogni volta che apri Chrome: ((( – edt

+1

questa "tutta la finestra di Chrome è chiusa" è molto importante! – rluks

37

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

Passare alla directory contenente i file Web, e:

python -m SimpleHTTPServer 

quindi connettersi a http://localhost:8000/index.html con qualsiasi browser web per testare la vostra pagina.

+1

È fantastico! Grazie, Sébastien! –

+1

Ricevo ancora 'XMLHttpRequest non può caricare _url_. Origine http: // localhost: 8000 non è consentito da Access-Control-Allow-Origin. – bafromca

+1

non ha funzionato neanche su OS X – Danny

0

Un altro modo per aggirare il problema è l'utilizzo della sandbox di sicurezza locale e dei metodi ExternalInterface di Flash Player. È possibile 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 classe 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 iniziato un codice di Google (ironico?) Progetto per la realizzazione: http://code.google.com/p/flash-loader/

2

È possibile inserire il vostro JSON in file js e salvarlo variabile globale. Non è asincrono, ma può aiutare.

0

Questo codice ha funzionato bene con sheet.jsonlocally con sincronizzazione del 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() { 
..... 
} 
Problemi correlati