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, но я сузил его до этого кода. Что безумно, если я заменю локальный файл удаленным путем, синтаксической ошибки не будет (вот пример):

http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?

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

Greg 02.12.2008 23:57

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

Mike 03.12.2008 00:31

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

James 03.12.2008 02:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
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");

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