некорректное предупреждение при загрузке клиентского JSON в Firefox через jQuery.ajax

Я использую метод jQuery ajax для получения статического файла JSON. Данные загружаются из локальной файловой системы, следовательно, сервера нет, поэтому я не могу изменить тип MIME.

Это отлично работает в Safari, но Firefox (3.6.3) сообщает, что файл «неправильно сформирован». Мне известно о подобном посте, посвященном переполнению стека, и я просмотрел его:

неверно сформированная ошибка в Firefox, когда загрузка файла JSON с помощью XMLHttpRequest

Я считаю, что мой JSON сформирован правильно:

{
    "_": ["appl", "goog", "yhoo", "vz", "t"]
}

Мой вызов ajax прост:

$.ajax({
    url: 'data/tickers.json', 
    dataType: 'json',
    async: true,
    data: null,
    success: function(data, textStatus, request) {
        callback(data);
    }
});

Если я оберну JSON тегом документа:

<document>JSON data</document>

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

Итак: есть ли способ избежать предупреждения Firefox при чтении файлов JSON на стороне клиента?


person Zhami    schedule 11.04.2010    source источник
comment
Что произойдет, если вы не воспользуетесь странным элементом-оболочкой?   -  person Matti Virkkunen    schedule 12.04.2010
comment
Если я не использую странную оболочку, данные JSON загружаются, но я получаю неверное предупреждение.   -  person Zhami    schedule 12.04.2010


Ответы (2)


Иногда использование HTTP-сервера невозможно, что может означать, что для некоторых файлов не будут автоматически предоставлены типы MIME. Адаптировано из ответа Питера Хоффмана на jQuery .getJSON Синтаксическая ошибка Firefox 3 Undefined используйте этот код перед вызовом $ .getJSON ():

$.ajaxSetup({beforeSend: function(xhr){
  if (xhr.overrideMimeType)
  {
    xhr.overrideMimeType("application/json");
  }
}
});

Или, если вы используете $ .ajax ():

$.ajax({
  url: url,
  beforeSend: function(xhr){
    if (xhr.overrideMimeType)
    {
      xhr.overrideMimeType("application/json");
    }
  },
  dataType: 'json',
  data: data,
  success: callback
});
person Ryan    schedule 20.11.2010
comment
Примечательно, что, похоже, в 2016 году он ВСЕГДА нужен с использованием $ .getJSON (). - person A. L. Flanagan; 28.10.2016
comment
@ A.L.Flanagan Я постоянно удивляюсь, что он все еще получает положительные голоса. Я рад набранным очкам, но мне грустно, что проблема не решена каким-либо другим способом с помощью автоматического обнаружения запросов локальных файлов. - person Ryan; 04.11.2016
comment
Спасибо, у меня это сработало! Я использую jQuery локально без сервера, и это устранило мою проблему. - person Salvo; 26.04.2017
comment
@Salvo Рад помочь! Сейчас 2017 год, и это все еще актуально. XD - person Ryan; 27.04.2017
comment
И, видимо, все еще актуально в 2018 году. Спасибо. - person DLH; 18.07.2018
comment
@DLH Ой. Рад помочь! - person Ryan; 18.07.2018
comment
Сентябрь 2018 г., и просто использовал его для $.ajax(). - person Pegues; 06.09.2018
comment
@Pegues Рад, что это вам помогло! - person Ryan; 07.09.2018
comment
@Ryan, спасибо за это. У меня есть последний FF (75.0), это 2020 год, через десять лет после вашего ответа, и он по-прежнему актуален для $ .ajax! Я убедился, что тип Mime предоставляется сервером правильно, что не является проблемой в других браузерах, но у FF все еще есть это предупреждение. - person BReddy; 16.04.2020

Локальные файлы и скрипты несовместимы. Кстати, слишком много вещей, связанных с безопасностью браузера, и других странностей. Если вы хотите что-то протестировать, вы должны запускать свои данные через HTTP-сервер. Хорошей идеей может быть установка одного из них локально.

person Matti Virkkunen    schedule 11.04.2010