2009-12-01 10 views
7

estoy haciendo una llamada AJAX para recuperar algo de texto sin formato:¿Por qué jQuery insiste en que mi texto plano no está "bien formado"?

$.ajax({ 
    url:   "programData.txt", 
    type:  "GET", 
    dataType: "text", 
    cache:  false, 
    success:  processData 
}); 

Cuando hago la solicitud, sin embargo, me sale el siguiente error:

Error: not well-formed Source File: file:///projects/foo/programData.txt?_=1259694590361 Line: 1, Column: 2

¿Por qué jQuery tratando de procesar mi texto sin formato y ¿cómo hago para detenerlo?

+0

Puede haber una 'Content-Type: application/json' header (o similar) en la respuesta? –

+0

Para establecer el tipo de contenido correcto, he configurado config en el Appache o en .htaccess: AddType text/plain .hbs (Todos * .hbs deben enviarse con texto de tipo de contenido). Firefox estaba contento. –

Respuesta

11

¿Está cargando la página en su navegador a través de HTTP o simplemente abriéndola como un archivo normal? ¿La dirección de la página que ejecuta el javascript comienza con http: o file:? Sospecho que es lo último, y Ajax llama al trabajo de manera diferente en esa situación (ver la respuesta de tvanfonsson a continuación). Si está compilando una aplicación web que se servirá a través de HTTP más adelante, intente ejecutar su página usando un servidor HTTP local.

+0

De hecho, lo estaba intentando con 'file: // 'acceso. Pasar a Apache solucionó el problema. –

0

tipos soportados son:

* "xml": Treat the response as an XML document that can be processed via jQuery. 
* "html": Treat the response as HTML (plain text); included script tags are evaluated. 
* "script": Evaluates the response as JavaScript and evaluates it. 
* "json": Evaluates the response as JSON and sends a JavaScript Object to the success callback. 

Quizás utilizar debe utilizar "html" en lugar de "texto", ya que jQuery parece no analizar nada si especifica html como el tipo.

+3

http://docs.jquery.com/Ajax/jQuery.ajax#options parece incluir más tipos de datos que eso, aunque no puedo hablar con versiones anteriores de jQuery –

3

Al abrir un archivo local a través de XMLHttpRequest, obtiene diferentes códigos de respuesta que cuando utiliza una solicitud HTTP. Sospecho que como abres un archivo local, jQuery se está ahogando en el código de respuesta, pensando que es un error porque no es 200 OK.

Reference

Example: Non-HTTP synchronous request

Despite its name, XMLHttpRequest can be used for non-HTTP requests. This example shows how to use it to fetch a file from the local file system.

var req = new XMLHttpRequest(); 
req.open('GET', 'file:///home/user/file.json', false); 
req.send(null); 
if(req.status == 0) 
    dump(req.responseText); 

The key thing to note here is that the result status is being compared to 0 for success instead of 200. This is because the file and ftp schemes do not use HTTP result codes

+0

jquery maneja la caja 0 correctamente (al menos 1.5 hace). El problema en este caso fue el tipo de mimo, creo. – studgeek

0

jQuery no parecen tener este problema en el cromo y el IE8.

11

Firefox intenta analizar el archivo como HTML antes de devolverlo a jQuery.

Existen varias razones por las que podría estar intentando hacer esto. Si, como sugirió Jaanus, está utilizando un archivo: // o Chrome: // URL, entonces no tiene un tipo MIME y asume HTML. O su servidor HTTP podría devolver el tipo MIME incorrecto.

A partir de jQuery 1.5.1 hay una opción mimeType para anular el tipo MIME devuelto que Firefox ve. Así que usted puede hacer lo siguiente:

$.ajax({ 
    mimeType: 'text/plain; charset=x-user-defined', 
    url:   "programData.txt", 
    type:  "GET", 
    dataType: "text", 
    cache:  false, 
    success:  processData 
}); 

Doc en la opción mimeType está en http://api.jquery.com/jQuery.ajax/

Y es aquí algunos antecedentes sobre lo que está pasando a nivel Firefox: https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest#Receiving_binary_data

+0

Ya estaba bajo apache. Si intenta abrir un archivo txt simple obtendrá "error de sintaxis XML". ¡Pero esto funcionó! –

Cuestiones relacionadas