2010-01-26 17 views
10

Sto sviluppando un'applicazione JavaScript che deve essere eseguita da un server Web (su http) o dal file system (su un file: // URL).Leggi file: // URL in IE XMLHttpRequest

Come parte di questo codice, è necessario utilizzare XMLHttpRequest per caricare i file nella stessa directory della pagina e nelle sottodirectory della pagina.

Questo codice funziona bene ("PASS") quando eseguito su un server web, ma non funziona ("FAIL") in Internet Explorer 8 quando scappare il file system:

<html><head> 
<script> 
window.onload = function() { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", window.location.href, false); 
    xhr.send(null); 
    if (/TestString/.test(xhr.responseText)) { 
    document.body.innerHTML="<p>PASS</p>"; 
    } 
} 
</script> 
<body><p>FAIL</p></body> 

Naturalmente , all'inizio fallisce perché nessun script può essere eseguito sul file system; All'utente viene visualizzata una barra gialla, che avverte che "Per proteggere la sicurezza, Internet Explorer ha limitato questa pagina Web dall'esecuzione di script o controlli ActiveX che potrebbero accedere al computer."

Ma anche una volta che faccio clic sulla barra e "Consenti contenuto bloccato" la pagina continua a fallire; Ricevo un errore "Accesso negato" sulla chiamata xhr.open.

Questo mi imbarazza, perché MSDN dice che "Per scopi di sviluppo, il protocollo file: // è consentito dall'area Computer locale". Questo file locale dovrebbe far parte della zona macchina locale, giusto?

Come posso ottenere un codice come questo per funzionare? Sto bene con la richiesta all'utente di avvertimenti di sicurezza; Non sto bene costringendoli a disattivare la sicurezza nel pannello di controllo.

MODIFICA: Non sto, infatti, caricando un documento XML nel mio caso; Sto caricando un file di testo normale (.txt).

+0

Hai provato var xhr = new ActiveXObject ("MSXML2.XMLHTTP"); (vedi la mia risposta qui sotto)? Questo non dovrebbe essere limitato ai file XML. Ma sarà limitato a IE. – Don

+0

FWIW, ho lo stesso problema in Chrome facendo praticamente la stessa cosa. – apollodude217

risposta

7

Hmm, potrebbe essere la differenza tra l'oggetto nativo XMLHttpRequest e quello ActiveX? Mi sembra di ricordare qualcosa a riguardo. Cioè, invece di

var xhr = new XMLHttpRequest(); 

provare

var xhr = new ActiveXObject("MSXML2.XMLHTTP"); 

Ovviamente, mettere alcuni controlli in atto per vedere se il browser supporta ActiveX. Naturalmente, questo è limitato solo a IE.

+0

ottiene ancora il permesso negato in IE10 – FlavorScape

+0

ummmm sì SCRIPT5: accesso negato. lo stesso errore vieni :( –

+0

mi è piaciuta la risposta grazie –

6

Mi è capitato di imbattersi esattamente nello stesso problema. Come suggerito sopra, il "costruttore" ActiveX non nativo funziona. Non sono sicuro che ci siano politiche differenti applicate ai due oggetti, ma dal momento che jQuery menziona lo stesso problema, potrebbe trattarsi di un vero bug. Ecco il pezzo rilevante del codice della sorgente di jQuery (1.4.2, linea 4948):

// Create the request object; Microsoft failed to properly 
// implement the XMLHttpRequest in IE7 (can't request local files), 
// so we use the ActiveXObject when it is available 
// This function can be overriden by calling jQuery.ajaxSetup 
xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? 
    function() { 
     return new window.XMLHttpRequest(); 
    } : 
    function() { 
     try { 
      return new window.ActiveXObject("Microsoft.XMLHTTP"); 
     } catch(e) {} 
    } 
+0

Ah, questo spiega perché l'aggiornamento di jQuery oltre la v1.11.1 ha causato problemi di autorizzazione su IE11 quando abbiamo usato il metodo .load. Immagino che jQuery abbia smesso di controllarlo dopo un certo versione – calculuswhiz

6

Come posso ottenere il codice come questo per lavorare?

Come suggerito sopra, questo sembra un errore in Microsoft XMLHttpRequest. jQuery (lug 2011) scrive anche: -

Microsoft non è riuscito a implementare correttamente il XMLHttpRequest in IE7 (non può richiedere i file locali)

Confermo questo fallimento per IE8 troppo.

Una soluzione è utilizzare new window.ActiveXObject("Microsoft.XMLHTTP") per i file locali se XMLHttpRequest non funziona.

Il fallimento è in prima linea xhr.open modo che possa essere catturato lì e quindi provare ActiveXObject come segue: -

var xhr = new XMLHttpRequest() 
try { 
    xhr.open('GET', url, true) 
} 
catch(e) { 
    try { 
     xhr = new ActiveXObject('Microsoft.XMLHTTP') 
     xhr.open('GET', url, true) 
    } 
    catch (e1) { 
     throw new Error("Exception during GET request: " + e1) 
    } 
} 

Questo codice almeno usare standard di XMLHttpRequest per IE9 (non testato) e futuri browser IE, se/quando Microsoft corregge l'errore. Con il codice jQuery riportato sopra, verrà utilizzato lo standard Microsoft.XMLHTTP ogni volta che ActiveXObject è disponibile, anche se Microsoft risolve l'errore.

+0

non funziona. Ancora ottenere il permesso negato con il nuovo ActiveXObject ('Microsoft.XMLHTTP') in IE10 – FlavorScape

+0

Ran anche in questo problema. XMLHttpRequest ha esito negativo per i file locali anche fino a IE11. .. Forse lo hanno fatto in Edge, io donno. Meno male che ActiveXObject funziona almeno. – calculuswhiz