Почему jQuery настаивает на том, что мой обычный текст не "правильно сформирован"?

Я делаю AJAX-вызов для получения простого текста:

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

Когда я делаю запрос, я получаю следующую ошибку:

Ошибка: неправильно сформированный исходный файл: file:///projects/foo/programData.txt?_=1259694590361 Строка: 1, столбец: 2

Почему jQuery пытается обработать мой простой текст и как его остановить?

5 ответов

Решение

Вы загружаете страницу в браузере по HTTP или просто открываете ее как обычный файл? Адрес страницы, на которой запущен javascript, начинается с http: или file:? Я подозреваю, что это последнее, и Ajax-вызовы работают по-другому в этой ситуации (см. Ответ tvanfonsson ниже). Если вы создаете веб-приложение, которое позже будет обслуживаться по протоколу HTTP, попробуйте запустить страницу с помощью локального HTTP-сервера.

Firefox пытается проанализировать файл как HTML, прежде чем он вернет его обратно в jQuery.

Есть несколько причин, почему это может быть попытка сделать это. Если, как предположил Яанус, вы используете URL-адрес file: // или chrome: //, тогда он не имеет типа MIME и предполагает использование HTML. Или ваш HTTP-сервер может возвращать неправильный тип MIME.

Начиная с jQuery 1.5.1, существует опция mimeType для переопределения возвращаемого типа MIME, который видит Firefox. Таким образом, вы можете сделать следующее:

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

Документ о параметре mimeType находится по адресу http://api.jquery.com/jQuery.ajax/

И вот некоторые сведения о том, что происходит на уровне Firefox: https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest

При открытии локального файла через XMLHttpRequest вы получаете разные коды ответов, чем при использовании HTTP-запроса. Я подозреваю, что, поскольку вы открываете локальный файл, jQuery задыхается от кода ответа, думая, что это ошибка, потому что это не 200 OK,

Ссылка

Пример: синхронный запрос не HTTP

Несмотря на свое название, XMLHttpRequest может использоваться для запросов не HTTP. В этом примере показано, как использовать его для извлечения файла из локальной файловой системы.

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

Ключевым моментом, который следует здесь отметить, является то, что статус результата сравнивается с 0 для успеха вместо 200. Это связано с тем, что схемы файлов и ftp не используют коды результатов HTTP.

Поддерживаемые типы:

* "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. 

Возможно, использование должно использовать "html" вместо "text", поскольку jQuery, похоже, ничего не анализирует, если вы укажете html в качестве типа.

У jQuery, похоже, нет этой проблемы на chrome и ie8.

Другие вопросы по тегам