JQuery .getJSON Синтаксическая ошибка Firefox 3 не определена

Я получаю синтаксическую ошибку (неопределенная строка 1 test.js) в Firefox 3 при запуске этого кода. Предупреждение работает правильно (отображается «работает»), но я понятия не имею, почему получаю синтаксическую ошибку.

Код jQuery:

$.getJSON("json/test.js", function(data) {
    alert(data[0].test);
});

Test.js:

[{"test": "work"}]

Есть идеи? Я работаю над этим для большего файла .js, но я сузил его до этого кода. Что безумно, если я заменю локальный файл удаленным путем, синтаксической ошибки не будет (вот пример):

Вы можете опубликовать тестовый пример? Также не должно быть $ .getJSON?

Greg 02.12.2008 23:57

Ага, извините за опечатку. Я не уверен, что вы просите по тесту?

Mike 03.12.2008 00:31

Почему вы возвращаете массив в test.js? Почему не просто объект?

James 03.12.2008 02:34
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
10
3
16 890
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Попробуйте переименовать test.js в test.json, что, по словам Википедия, является официальным расширением для файлов JSON. Возможно, в какой-то момент он обрабатывается как Javascript.

Нет, этого не произошло. Та же синтаксическая ошибка (неопределенная строка 1 test.json)

Mike 03.12.2008 00:15

Вы пробовали отключить все расширения Firefox?

Обычно я получаю некоторые ошибки в консоли Firebug, которые вызваны расширениями, а не посещаемыми веб-сайтами.

Да, я попытался отключить все надстройки, но все равно получаю сообщение об ошибке через консоль ошибок.

Mike 20.05.2009 23:42

Это может показаться действительно глупым, но измените расширение файла test.js с .js на .txt. У меня было то же самое с совершенно корректными файлами данных JSON с любым расширением, кроме .txt (пример: .json, .i18n). Поскольку я изменил расширение, я получаю данные и прекрасно их использую.

Как я уже сказал, это может показаться глупым, но у меня это сработало.

Пытался перейти на расширение .txt, но все еще выдает ошибку. Я могу получить все данные, но получаю сообщение об ошибке. К счастью, при размещении на реальном веб-сервере (в отличие от работы локально) он работает нормально (без ошибок).

Mike 20.05.2009 23:45

Проверьте, есть ли ; в конце 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);
    } });

Он также работает для переопределения типа контента на стороне сервера с использованием заголовка типа контента.

Ian McLaird 26.09.2009 00:08

Питер: Спасибо, спасибо, Спасибо! У меня была эта проблема (stackoverflow.com/questions/2618959/…), которую я решил с помощью вашего ответа здесь. Я сделал одно изменение, и оно заключалось в использовании «application / json» вместо «text / plain».

Ryan 21.11.2010 21:34

В вашем втором примере с использованием $.ajax, mimeType:'textPlain', похоже, не работает для меня, тогда как mimeType:'text/plain' работает.

shennan 14.03.2014 01:25

Попробуйте настроить тип содержимого файла .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");

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