JQuery.getJSON Firefox 3 Синтаксическая ошибка Undefined

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

Ответ 1

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

$.ajaxSetup({'beforeSend': function(xhr){
    if (xhr.overrideMimeType)
        xhr.overrideMimeType("text/plain");
    }
});

Теперь объяснение: В firefox 3 (и я использую только firefox THREE) каждый файл, который имеет mime-тип "text/xml", анализируется и проверяется синтаксисом. Если вы запустите свой JSON с помощью "[", он поднимет Синтаксическую ошибку, если она начнется с "{" это "ошибка с ошибкой" (мой перевод для "nicht wohlgeformt" ). Если я получаю доступ к моему json файлу из локального script - сервер не включен в этот прогресс - мне нужно переопределить тип 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

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

Ответ 3

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

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

Ответ 4

HI

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

Или, по крайней мере, похоже, что ошибка ушла для меня.

Ответ 10

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

  • Киен

Ответ 11

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

var r = new XMLHttpRequest();
r.open("GET", filepath, true);
r.overrideMimeType("text/plain");