¿Por qué jQuery insiste en que mi texto simple no está “bien formado”?

Estoy haciendo una llamada AJAX para recuperar un texto sin formato:

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

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

Error: no es un archivo fuente bien formado: archivo: ///proyectos / trabajo / progtwig / datos.txt? _ = 1259694590361 Línea: 1, Columna: 2

¿Por qué jQuery está tratando de procesar mi texto sin formato y cómo puedo detenerlo?

¿Está cargando la página en su navegador a través de HTTP o simplemente la abre 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 las llamadas de Ajax funcionan de manera diferente en esa situación (vea la respuesta de tvanfonsson a continuación). Si está creando una aplicación web que se servirá a través de HTTP más adelante, intente ejecutar su página utilizando un servidor HTTP local.

Firefox está intentando analizar el archivo como HTML antes de devolverlo a jQuery.

Hay varias razones por las que podría estar tratando de 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 estar devolviendo 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 puedes hacer lo siguiente:

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

La opción Doc en mimeType se encuentra en http://api.jquery.com/jQuery.ajax/

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

Cuando abre un archivo local a través de XMLHttpRequest, obtiene diferentes códigos de respuesta que cuando utiliza una solicitud HTTP. Sospecho que dado que está abriendo un archivo local, jQuery se está atragantando con el código de respuesta, pensando que es un error porque no está 200 OK .

Referencia

Ejemplo: solicitud síncrona no HTTP

A pesar de su nombre, XMLHttpRequest se puede usar para solicitudes no HTTP. Este ejemplo muestra cómo usarlo para obtener un archivo del sistema de archivos local.

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

La clave a tener en cuenta aquí es que el estado del resultado se compara con 0 para el éxito en lugar de 200. Esto se debe a que los esquemas de archivo y ftp no usan códigos de resultado HTTP

Los 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 el uso debería usar “html” en lugar de “texto”, ya que jQuery parece no analizar nada si se especifica html como tipo.

jQuery no parece tener este problema en Chrome y ie8.