Почему 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 в качестве типа.