Я получаю синтаксическую ошибку (неопределенная строка 1 test.js) в Firefox 3 при запуске этого кода. Предупреждение работает правильно (отображается «работает»), но я понятия не имею, почему получаю синтаксическую ошибку.
Код jQuery:
$.getJSON("json/test.js", function(data) {
alert(data[0].test);
});
Test.js:
[{"test": "work"}]
Есть идеи? Я работаю над этим для большего файла .js, но я сузил его до этого кода. Что безумно, если я заменю локальный файл удаленным путем, синтаксической ошибки не будет (вот пример):
Ага, извините за опечатку. Я не уверен, что вы просите по тесту?
Почему вы возвращаете массив в test.js? Почему не просто объект?
Попробуйте переименовать test.js в test.json, что, по словам Википедия, является официальным расширением для файлов JSON. Возможно, в какой-то момент он обрабатывается как Javascript.
Нет, этого не произошло. Та же синтаксическая ошибка (неопределенная строка 1 test.json)
Вы пробовали отключить все расширения Firefox?
Обычно я получаю некоторые ошибки в консоли Firebug, которые вызваны расширениями, а не посещаемыми веб-сайтами.
Да, я попытался отключить все надстройки, но все равно получаю сообщение об ошибке через консоль ошибок.
Это может показаться действительно глупым, но измените расширение файла test.js с .js на .txt. У меня было то же самое с совершенно корректными файлами данных JSON с любым расширением, кроме .txt (пример: .json, .i18n). Поскольку я изменил расширение, я получаю данные и прекрасно их использую.
Как я уже сказал, это может показаться глупым, но у меня это сработало.
Пытался перейти на расширение .txt, но все еще выдает ошибку. Я могу получить все данные, но получаю сообщение об ошибке. К счастью, при размещении на реальном веб-сервере (в отличие от работы локально) он работает нормально (без ошибок).
Проверьте, есть ли ; в конце test.js. jQuery выполняет eval("(" + data + ")"), и точка с запятой не позволит Firefox найти закрывающую скобку. И могут быть другие невидимые персонажи, которые мешают этому.
Я могу сказать вам, почему это удаленное место работает, потому что оно выполнено совершенно по-другому. Поскольку jsoncallback=? является частью параметров запроса, jQuery воспринимает его как JSONP и фактически вставляет его в DOM внутри тегов <script>. Попробуйте использовать "json/test.js?callback=?" в качестве цели, это тоже может помочь.
На каком веб-сервере вы это используете? Однажды у меня была проблема с чтением файла JSON в IIS, потому что он не был определен как допустимый тип MIME.
Я нашел решение, чтобы избавиться от этой ошибки
$.ajaxSetup({'beforeSend': function(xhr){
if (xhr.overrideMimeType)
xhr.overrideMimeType("text/plain");
}
});
Теперь объяснение: В firefox 3 (а я предполагаю только firefox THREE) каждый файл с mime-типом «text / xml» анализируется и проверяется синтаксис. Если вы начнете свой JSON с «[», это вызовет синтаксическую ошибку, если он начинается с «{», это «искаженная ошибка» (мой перевод для «nicht wohlgeformt»). Если я получаю доступ к своему json-файлу из локального скрипта - сервер не включается в этот прогресс - я должен переопределить mime-тип ... Возможно, вы неправильно установили свой MIME-тип для этого самого файла ...
Однако добавление этого небольшого фрагмента кода избавит вас от сообщения об ошибке.
Редактировать: В jquery 1.5.1 или выше вы можете использовать параметр mimeType для достижения того же эффекта. Чтобы установить его по умолчанию для всех запросов, используйте
$.ajaxSetup({ mimeType: "text/plain" });
Вы также можете использовать его напрямую с $ .ajax, т.е. ваши вызовы переводятся в
$.ajax({
url: "json/test.js",
dataType: "json",
mimeType: "textPlain",
success: function(data){
alert(data[0].test);
} });
Он также работает для переопределения типа контента на стороне сервера с использованием заголовка типа контента.
Питер: Спасибо, спасибо, Спасибо! У меня была эта проблема (stackoverflow.com/questions/2618959/…), которую я решил с помощью вашего ответа здесь. Я сделал одно изменение, и оно заключалось в использовании «application / json» вместо «text / plain».
В вашем втором примере с использованием $.ajax, mimeType:'textPlain', похоже, не работает для меня, тогда как mimeType:'text/plain' работает.
Попробуйте настроить тип содержимого файла .js. Firefox, по-видимому, ожидает, что он будет текстовым / простым. Вы можете сделать это, как это делает Питер Хоффманн, или вы можете установить на стороне сервера заголовок типа контента.
Это может означать изменение конфигурации на стороне сервера (например, файл apache mime.types) или, если json обслуживается из сценария, установка заголовка типа содержимого в сценарии.
Или, по крайней мере, мне кажется, что ошибка исчезла.
У меня была аналогичная проблема, но я перебирал цикл for. Я думаю, проблема может заключаться в том, что индекс находится вне пределов диапазона
ПРИВЕТ
У меня такая же ошибка при тестировании веб-страницы на моем локальном ПК, но как только она появляется на сервере хостинга, ошибка больше не возникает. Извините, я понятия не имею о причине, но подумал, что это может помочь кому-то другому найти причину
GetJSON может настаивать на использовании хотя бы одной пары имя: значение. Прямой массив ["item0","item1","Item2"] является допустимым JSON, но не на что ссылаться в функции обратного вызова для getJSON.
В этом небольшом массиве почтовых индексов:
{"result":[["43001","ALEXANDRIA"],["43002","AMLIN"],["43003","ASHLEY"],["43004","BLACKLICK"],["43005","BLADENSBURG"],["43006","BRINKHAVEN"]]}
... Я застревал, пока не добавил тег {"result":. Позже я мог бы сослаться на это:
<script>
$.getJSON("temp_test_json.php","",
function(data) {
$.each(data.result, function(i, item) {
alert(item[0]+ " " + i);
if (i > 4 ) return false;
});
});
</script>
... Я также обнаружил, что было проще использовать $ .each ().
Для людей, которые не используют jQuery, вам необходимо вызвать метод overrideMimeType перед отправкой запроса:
var r = new XMLHttpRequest();
r.open("GET", filepath, true);
r.overrideMimeType("text/plain");
Вы можете опубликовать тестовый пример? Также не должно быть $ .getJSON?