Utilizzo di iframe con file locali in Chrome

Mi sto divertendo a capire come accedere a una pagina caricata in un iframe dalla pagina esterna. Entrambe le pagine sono file locali e sto utilizzando Chrome.

Ho una pagina esterna e molte pagine interne. La pagina esterna dovrebbe sempre mostrare il titolo della pagina per la pagina interna (ha senso nella mia applicazione, forse meno in questo esempio ridotto). Funziona senza problemi in AppJS, ma mi è stato richiesto di far funzionare questa app direttamente nel browser. Ricevo l’errore ” Bloccato un frame con origine” null “dall’accesso a un frame con origine” null “. I protocolli, i domini e le porte devono corrispondere. “.

Penso che ciò sia dovuto allo stesso criterio di origine di Chrome relativo ai file locali, ma questo non mi ha aiutato a risolvere il problema direttamente. Posso aggirare il problema in questo esempio ridotto utilizzando il metodo window.postMessage per Ways per aggirare la politica di origine stessa . Tuttavia, andando oltre questo esempio, voglio anche manipolare il DOM della pagina interna dalla pagina esterna, poiché questo renderà il mio codice molto più pulito, quindi i messaggi di pubblicazione non faranno il lavoro.

Pagina esterna

      This text is in the outer page     

Pagina Interna

    Home    This text is in the inner page   

JavaScript

 var iFrameWindow = document.getElementById("PageContent_Iframe").contentWindow; var pageTitleElement = iFrameWindow.$("#Page_Title"); 

Per È probabile che le versioni future di Chrome supportano contentWindow / contentDocument quando iFrame carica un file html locale dal file html locale? , Ho provato a lanciare Chrome con la bandiera

 --allow-file-access-from-files 

Ma non ci sono stati cambiamenti nei risultati.

Per disabilitare lo stesso criterio di origine in Chrome , ho provato a lanciare Chrome con il flag

 --disable-web-security 

Ma di nuovo non ci sono stati cambiamenti nei risultati.

Per Cosa fa document.domain = document.domain? , Ho avuto entrambe le pagine eseguire il comando

 document.domain = document.domain; 

Ciò ha provocato l’errore ” Bloccato un frame con origine” null “dall’accesso a un frame con origine” null “. Il frame che richiedeva l’accesso impostava” document.domain “a” “, ma il frame a cui si stava accedendo no. document.domain “allo stesso valore per consentire l’accesso.

Per divertimento, ho avuto entrambe le pagine eseguire il comando

 document.domain = "foo.com"; 

Ciò ha provocato l’errore ” Errore non rilevato: SecurityError: DOM Exception 18 “.

Sto dibattendo. Qualsiasi aiuto da parte di persone più esperte sarebbe fantastico! Grazie!

Per la nostra discussione sul mio cubo solo un minuto fa 🙂

Colpisco lo stesso problema (la risposta post Ajax di js express continua a generare errori ) cercando di far funzionare correttamente una richiesta di posta AJAX.

Quello che mi ha preso in giro non è eseguire il file direttamente dal file system, ma eseguirlo da un server locale. Ho usato il nodo per eseguire express.js. È ansible installare express con il seguente comando: npm install -g express

Al termine, è ansible creare un progetto express con il seguente comando: express -s -e expressTestApp

Ora, in quella cartella, dovresti vedere un file chiamato app.js e una cartella chiamata public. Metti i file html con i quali desideri lavorare nella cartella pubblica. Ho sostituito il file app.js con il seguente codice:

 var express = require('/usr/lib/node_modules/express'); var app = express(); app.use(function(err, req, res, next){ console.error(err.stack); res.send(500, 'Something broke!'); }); app.use(express.bodyParser()); app.use(express.static('public')); app.listen(5555, function() { console.log("Server is up and running"); }); 

Nota, la riga richiesta potrebbe essere diversa. Devi trovare dove il tuo sistema è effettivamente express. Puoi farlo con il seguente comando: sudo find / -name express

A questo punto, avviare il server Web express con il seguente comando: node app.js

A questo punto, il server web è attivo e funzionante. Vai avanti e apri un browswer e vai al tuo indirizzo IP (o se sei sulla stessa macchina del tuo server, 127.0.0.1). Utilizza l’indirizzo IP: portnumber \ filename.html dove il numero di porta è il 5555 nel file app.js che abbiamo creato.

Ora in quel browser, non dovresti (e non l’hai provato quando lo abbiamo testato) avere qualcuno di questi stessi problemi.

Mi dispiace dirti che ho provato durante le settimane a risolvere questo problema (ne avevo bisogno per un progetto) e la mia conclusione è che non è ansible.

Ci sono molti problemi sull’accesso locale tramite javascript con chrome, e alcuni di essi possono essere risolti usando --allow-file-access-from-files e --disable-web-security , incluse alcune funzionalità offline HTML5, ma io sicuramente penso che non ci sia modo di accedere ai file locali.

Ti raccomando di non perdere tempo a cercare di circuire questo e di provare a postare messaggi che puoi interpretare nelle pagine interne, così puoi fare le modifiche DOM lì.

file: // protocol e http: // protocol fanno sì che le cose si comportino in modo molto diverso rispetto agli iframe. Ho avuto gli stessi problemi che descrivi con un’app su PhoneGap che utilizza il protocollo file per accedere a tutti i file locali all’interno della cartella risorse locali / www.

Se sembra che i browser moderni impediscano la visualizzazione di file “locali” utilizzando il protocollo file in iframe per motivi di sicurezza.

Abbiamo finito per scaricare iframe e usare solo div come “viewport”. Fortunatamente la dimensione complessiva della nostra app non era così grande, quindi siamo riusciti a caricare tutto in un’unica pagina.