2010-01-26 12 views
10

Estoy desarrollando una aplicación JavaScript que debe ejecutarse desde un servidor web (a través de http) o desde el sistema de archivos (en un archivo: // URL).Leer archivo: // URLs en IE XMLHttpRequest

Como parte de este código, necesito usar XMLHttpRequest para cargar archivos en el mismo directorio que la página y en los subdirectorios de la página.

Este código funciona bien ("PASS") cuando se ejecuta en un servidor web, pero no funciona ("FAIL") en Internet Explorer 8 cuando se ejecuta fuera del sistema de archivos:

<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> 

Por supuesto , al principio falla porque no se pueden ejecutar scripts en absoluto en el sistema de archivos; al usuario se le solicita una barra amarilla, advirtiendo que "Para ayudar a proteger su seguridad, Internet Explorer ha restringido que esta página web ejecute scripts o controles ActiveX que podrían acceder a su computadora".

Pero incluso una vez que hago clic en la barra y "Permitir contenido bloqueado" la página sigue fallando; Aparece un error de "Acceso denegado" en la llamada xhr.open.

Esto me desconcierta, porque MSDN dice que "para fines de desarrollo, el protocolo file: // está permitido desde la zona de Máquina local". Este archivo local debe ser parte de la zona de máquina local, ¿verdad?

¿Cómo puedo obtener un código como este para que funcione? Estoy bien con avisar al usuario con advertencias de seguridad; No estoy de acuerdo con forzarlos a desactivar la seguridad en el panel de control.

EDITAR: No estoy, de hecho, cargando un documento XML en mi caso; Estoy cargando un archivo de texto plano (.txt).

+0

¿Ha intentado var xhr = new ActiveXObject ("MSXML2.XMLHTTP"); (ver mi respuesta a continuación)? Eso no debe limitarse a archivos XML. Pero estará limitado a IE. – Don

+0

FWIW, tengo el mismo problema en Chrome haciendo básicamente lo mismo. – apollodude217

Respuesta

7

Hmm, ¿podría ser la diferencia entre el objeto nativo XMLHttpRequest y el ActiveX uno? Me parece recordar algo sobre eso. Es decir, en lugar de

var xhr = new XMLHttpRequest(); 

tratar

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

Obviamente, poner un poco de cheques en el lugar para ver si el navegador es compatible con ActiveX. Por supuesto, esto también está limitado a IE solamente.

+0

aún obtener permiso denegado en IE10 – FlavorScape

+0

ummmm sí SCRIPT5: acceso denegado. el mismo error viene :( –

+0

me encantó la respuesta. Gracias, –

6

Me tropecé con exactamente el mismo problema. Como se sugirió anteriormente, el "constructor" de ActiveX no nativo funciona. No estoy seguro de si existen diferentes políticas aplicadas a los dos objetos, pero como jQuery también menciona el mismo problema, puede tratarse de un error genuino. Aquí está la pieza relevante del código de la fuente de jQuery (1.4.2, línea 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, esto explica por qué la actualización de jQuery pasado v1.11.1 causó problemas de permisos en IE11 en el trabajo cuando usamos el método .load. Supongo que jQuery simplemente dejó de buscar esto después de un cierto versión. – calculuswhiz

6

¿Cómo puedo obtener el código como este para trabajar?

Como se sugirió anteriormente, esto parece una falla en Microsoft XMLHttpRequest. jQuery (jul 2011) también escribe: -

Microsoft no ha aplicado correctamente el XMLHttpRequest en IE7 (no puede solicitar archivos locales)

confirmo este fracaso para IE8 también.

Una solución es utilizar new window.ActiveXObject("Microsoft.XMLHTTP") para archivos locales si XMLHttpRequest no funciona.

El fallo está en la línea xhr.open para que pueda ser atrapado allí y luego tratar ActiveXObject de la siguiente manera: -

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) 
    } 
} 

Este código será, al menos, utilizar norma XMLHttpRequest para IE9 (no probado) y futuros navegadores es decir, si/cuando Microsoft corrige el error. Con el código jQuery anterior, se utilizará el Microsoft.XMLHTTP no estándar siempre que esté disponible ActiveXObject, incluso si Microsoft soluciona el error.

+0

No funciona. Todavía obtener permiso denegado con el nuevo ActiveXObject ('Microsoft.XMLHTTP') en IE10 – FlavorScape

+0

También se encontró con este problema en el trabajo. XMLHttpRequest falla para archivos locales incluso hasta IE11 aparentemente. Me pregunto por qué Microsoft nunca lo arregló. .. Tal vez lo hicieron en Edge, yo no. Lo bueno es que ActiveXObject funciona al menos. – calculuswhiz