2010-04-11 4 views
10

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

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

"not well-formed" error in Firefox when loading JSON file with XMLHttpRequest

Я считаю, что моя JSON хорошо сформированным:

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

Мой Аякса вызов прост:

$.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-файлах?

+0

Что происходит если вы * не используете * странный элемент оболочки? –

+0

Если я не использую странную оболочку, тогда данные JSON загружаются, но я получаю неверное предупреждение. – Zhami

ответ

37

Иногда использование HTTP-сервера не является вариантом, что может означать, что типы MIME не будут автоматически предоставлены для некоторых файлов. Адаптированный ответ Питера Хоффмана для jQuery .getJSON Firefox 3 Syntax Error 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 
}); 
+5

Замечательно, похоже, это STILL необходимо в 2016 году, используя $ .getJSON(). –

+2

@ A.L.Flanagan Я постоянно удивляюсь, что это все еще получает upvotes. Я доволен тем, что он приносит, но мне грустно, что он не разрешен каким-то другим способом посредством автоматического обнаружения локальных запросов файлов. – Ryan

+1

Спасибо, это сработало для меня! Я использую jQuery локально без сервера, и он исправил мою проблему. – Salvo

-4

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