Ошибка jQuery 1.5 AJAX с "недопустимой меткой" для запросов JSON

Я только что обновил версию 1.4 до версии 1.5 jQuery, и теперь мои вызовы AJAX всегда терпят неудачу с ошибкой "неправильной метки".

Пример запроса:

jQuery.ajax({
    async: false
    , dataType: "json"
    , error: function (xhr, status, error) { ... }
    , success: function (data, status, xhr) { ... }
    , type: "post"
    , url: "ajax/request.asp"
});

В сети я обнаружил, что эта ошибка возникает, когда возвращаемый JSON не обернут обратным вызовом jQuery (например, jQuery1234({ "something": "abcd" }).

Проблема в том, что я возвращаю JSON, а не JSONP (и я указываю его в запросе AJAX), так почему я должен указать обратный вызов в возвращаемом JSON?

1.5 changelog ничего не говорит об этом... (Или это я не умею читать?)

Update:

Это пример не работающего JSON:

{
   "esito":"Ok",
   "centriCosto":[
      {
         "id":"1",
         "descrizione":"Colazione"
      },
      {
         "id":"2",
         "descrizione":"Pranzo"
      },
      {
         "id":"3",
         "descrizione":"Cena"
      }
   ]
}

И это один и тот же обработчик JSON, обернутый обратным вызовом:

jQuery1502710949228847014_1296739130498({
   "esito":"Ok",
   "centriCosto":[
      {
         "id":"1",
         "descrizione":"Colazione"
      },
      {
         "id":"2",
         "descrizione":"Pranzo"
      },
      {
         "id":"3",
         "descrizione":"Cena"
      }
   ]
})

Кстати, Firebug говорит, что оба они являются действительными JSON (и он очень придирчив к правильности).

Ответ 1

Хорошо, я узнал, что, черт возьми, происходит.

jQuery Плагин проверки несовместим с jQuery 1.5 (см. один и два), удаляя выходы плагинов в правильное поведение.

Если у кого-то еще есть эта проблема, есть патч в репозитории плагинов: ссылка

Ответ 2

Я столкнулся с аналогичной проблемой, но, похоже, это связано с этой ошибкой: http://bugs.jquery.com/ticket/8398

Это не обязательно связано с jQuery-validate, и мне потребовалось некоторое время, чтобы разобраться. Оказывается, что jQuery 1.5 модифицирует последующие вызовы ajax для json для jsonp, что приводит к этой ошибке.

Я исправил его, выполнив одно из обходных решений, предложенных в истории изменений об ошибках, и разместив следующий код где-то до того, как будут сделаны мои вызовы ajax:

$.ajaxSetup({
   jsonp: null,
   jsonpCallback: null
});

Должны также исправить любые проблемы для других запросов ajax.

Ответ 3

Ниже приведено возможное обходное решение для тех, у кого есть плагин validator.

dataType: "text json"

Работает как шарм. Не спрашивай меня, почему. На chrome вы можете увидеть синтаксическую ошибку jquery, анализируя ":" в возврате json. И не ошибитесь в этом, возвращение действительно json. Я не пробовал, но я подозреваю, что Том ответ будет также работать.

Ответ 4

попробовать: Прошел быстрый поиск json в jquery-1.5.js и нашел это в строке 6905:

//Обнаруживать, нормализовать параметры и установить обратные вызовы для запросов jsonp

jQuery.ajaxPrefilter("json jsonp", function( s, originalSettings, dataIsString /* internal */ ) {

удаление "json" из первого аргумента добавит правильное поведение, когда spec. dataType:"json"

Ответ 5

Если ваш серверный код опирается на имя обратного вызова, начинающееся с "jsonp", может возникнуть проблема. Префикс имени обратного вызова был изменен на "jQuery" в версии 1.5.

Ответ 6

похоже, что это исправлено сейчас в версии 1.6 - была такая же проблема после обновления до версии 1.5.1 и после обновления до версии 1.6 проблема исчезла.

Ответ 7

Обновление jQuery 1.7 разрешает его

Ответ 8

Здесь решение:

$.post("...", {},
        function(data) {

      // dont forget to add below lines         

         },"json");