jQuery .getJSON Firefox 3 Синтаксическая ошибка не определена - PullRequest
10 голосов
/ 02 декабря 2008

Я получаю синтаксическую ошибку (неопределенная строка 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=?

Ответы [ 11 ]

23 голосов
/ 11 марта 2009

Я нашел решение, чтобы пнуть эту ошибку

$.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);
    } });
2 голосов
/ 05 марта 2010

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 ().

1 голос
/ 07 декабря 2009

HI

У меня та же самая ошибка при тестировании веб-страницы на моем локальном ПК, но после ее запуска на хост-сервере ошибка больше не возникает. Извините - я понятия не имею о причине, но подумал, что это может помочь кому-то другому найти причину

1 голос
/ 11 декабря 2008

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

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

0 голосов
/ 16 августа 2015

Для людей, которые не используют jQuery, перед отправкой запроса необходимо вызвать метод overrideMimeType:

var r = new XMLHttpRequest();
r.open("GET", filepath, true);
r.overrideMimeType("text/plain");
0 голосов
/ 03 декабря 2009

У меня была похожая проблема, но я перебирал цикл for. Я думаю, что проблема может заключаться в том, что индекс вышел за рамки.

  • Кийно
0 голосов
/ 26 сентября 2009

Попробуйте настроить тип содержимого файла .js. Firefox ожидает, что это будет text / plain, по-видимому. Вы можете сделать это, как это делал Питер Хоффманн, или установить сторону заголовка типа контента на стороне сервера.

Это может означать изменение конфигурации на стороне сервера (например, файл apache mime.types) или, если json подается из скрипта, установка заголовка типа содержимого в скрипте.

Или, по крайней мере, из-за этого ошибка исчезла.

0 голосов
/ 09 марта 2009

На каком веб-сервере вы работаете? Однажды у меня возникла проблема с чтением файла JSON в IIS, поскольку он не был определен как допустимый тип MIME.

0 голосов
/ 09 марта 2009

Проверьте, есть ли ; в конце test.js. jQuery выполняет eval("(" + data + ")"), а точка с запятой не позволит Firefox найти закрывающую скобку. И могут быть некоторые другие невидимые символы, которые мешают ему сделать это.

Я могу сказать вам, почему это удаленное местоположение работает, потому что оно выполняется совершенно по-другому. Поскольку он имеет jsoncallback=? как часть параметров запроса, jQuery считает его JSONP и фактически вставляет его в DOM внутри тегов <script>. Попробуйте использовать "json/test.js?callback=?" в качестве цели, это тоже может помочь.

0 голосов
/ 03 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...