jquery - www - xslt transformation
XMLHttpRequest Origin null no está permitido Access-Control-Allow-Origin para file:/// to file:///(Serverless) (8)
Estoy tratando de crear un sitio web que pueda descargarse y ejecutarse localmente lanzando su archivo de índice.
Todos los archivos son locales, no se utilizan recursos en línea.
Cuando trato de usar el complemento AJAXSLT para jQuery para procesar un archivo XML con una plantilla XSL (en subdirectorios), recibo los siguientes errores:
XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/data/home.xml. Origin null is not allowed by Access-Control-Allow-Origin.
XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/assets/xsl/main.xsl. Origin null is not allowed by Access-Control-Allow-Origin.
El archivo de índice que realiza la solicitud es el file:///C:/path/to/XSL%20Website/index.html
mientras que los archivos JavaScript utilizados se almacenan en el file:///C:/path/to/XSL%20Website/assets/js/
.
¿Cómo puedo hacer para solucionar este problema?
¿Qué pasa con el uso de la función FileReader de javascript para abrir el archivo local, es decir:
<input type="file" name="filename" id="filename">
<script>
$("#filename").change(function (e) {
if (e.target.files != undefined) {
var reader = new FileReader();
reader.onload = function (e) {
// Get all the contents in the file
var data = e.target.result;
// other stuffss................
};
reader.readAsText(e.target.files.item(0));
}
});
</script>
Ahora haga clic en Choose file
botón Choose file
y busque el file:///C:/path/to/XSL%20Website/data/home.xml
Aquí hay un applecript que lanzará Chrome con el conmutador --allow-file-access-from-files activado, para los desarrolladores de OSX / Chrome:
set chromePath to POSIX path of "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
set switch to " --allow-file-access-from-files"
do shell script (quoted form of chromePath) & switch & " > /dev/null 2>&1 &"
En el caso de que ejecutar un servidor web local no sea una opción, puede permitir que Chrome acceda a file://
files a través de un interruptor del navegador. Después de algunas excavaciones, encontré esta discusión , que menciona un cambio de navegador en la publicación de apertura. Ejecuta tu instancia de Chrome con:
chrome.exe --allow-file-access-from-files
Esto puede ser aceptable para entornos de desarrollo, pero poco más. Ciertamente no quieres esto todo el tiempo. Esto todavía parece ser un problema abierto (a partir de enero de 2011).
Ver también: Problemas con jQuery getJSON usando archivos locales en Chrome
Esencialmente, la única forma de lidiar con esto es tener un servidor web ejecutándose en localhost y servirlos desde allí.
Es inseguro que un navegador permita que una solicitud ajax acceda a cualquier archivo en su computadora, por lo tanto, la mayoría de los navegadores parecen tratar las solicitudes "file: //" como que no tienen origen con el propósito de la " Política del mismo origen "
Iniciar un servidor web puede ser tan trivial como introducir en el directorio en el que se encuentran y están ejecutando los archivos:
python -m SimpleHTTPServer
Esta solución le permitirá cargar un script local utilizando jQuery.getScript (). Esta es una configuración global, pero también puede establecer la opción crossDomain para cada solicitud.
$.ajaxPrefilter( "json script", function( options ) {
options.crossDomain = true;
});
Inicie Chrome como para evitar esta restricción: open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files
.
Derivado del comentario de Josh Lee, pero necesitaba especificar la ruta completa a Google Chrome para evitar que Google Chrome se abra desde mi partición de Windows (en Parallels).
La forma en que acabo de solucionar esto es no usar XMLHTTPRequest, sino incluir los datos necesarios en un archivo javascript separado. (En mi caso, necesitaba un blob SQLite binario para usar con https://github.com/kripken/sql.js/ )
btoa()
un archivo llamado base64_data.js
(y usé btoa()
para convertir los datos que necesitaba e insertarlos en un <div>
para poder copiarlos).
var base64_data = "U1FMaXRlIGZvcm1hdCAzAAQA ...<snip lots of data> AhEHwA==";
y luego incluyó los datos en el html como javascript normal:
<div id="test"></div>
<script src="base64_data.js"></script>
<script>
data = atob(base64_data);
var sqldb = new SQL.Database(data);
// Database test code from the sql.js project
var test = sqldb.exec("SELECT * FROM Genre");
document.getElementById("test").textContent = JSON.stringify(test);
</script>
Me imagino que sería trivial modificar esto para leer JSON, tal vez incluso XML; Dejaré eso como un ejercicio para el lector;)
Puede intentar poner ''Access-Control-Allow-Origin'':''*''
en response.writeHead(, {[here]})
.