Подтвердить что ты не робот

JQuery post вызывает Uncaught SyntaxError: Неожиданный токен:

Я нашел кучу подобных вопросов, но после 3 часов чтения их и пробовать вещи, я отправляю свои собственные. Прошу прощения за дублирование, но я просто не знаю, что происходит здесь.

Итак, у меня есть эта функция javascript:

function saveSetting(settingName, settingValue) {
    $.post(
        appUrl + "Account/SaveSetting",
        { settingName: settingName, settingValue: settingValue },
        function (data) {
            alert(data.Result);
        },
        "json"
    );
}

который я называю следующим образом:

saveSetting("bookFontSize", fontSize);

где fontSize - "10.5" или что-то подобное.

Chrome сообщает заголовки сообщений следующим образом:

Request URL:http://localhost:1227/Account/SaveSetting?callback=jQuery151022712289774790406_1298625531801
Request Method:POST
Status Code:200 OK
Request Headers
Accept:text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:42
Content-Type:application/x-www-form-urlencoded
Cookie:ASP.NET_SessionId=jwpzp4okerckuh2bhkl2pnwu; .ASPXAUTH=429EEA1CFBFD9D5702011C59F77F18F8DAEEEB412314D608E86289779DF8ED9C80C6E0370B7108D68C44B088C7CB6998F34C59DDCFF8EA9D4A556495F5D40DF21737392DCF5942F73726882BEC354C35599864F751751FD458473FA4541AF25294F7E16DC00AABD4DEC43B321B0ECCBF195FD419C3BC912017275FC478A27F0C12A28D124A663EA5F19E5AEFFB276603
Host:localhost:1227
Origin:http://localhost:1227
Referer:http://localhost:1227/Read/116/1
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13
X-Requested-With:XMLHttpRequest
Query String Parameters
callback:jQuery151022712289774790406_1298625531801
Form Data
settingName:bookFontSize
settingValue:10.5
Response Headers
Cache-Control:private, s-maxage=0
Connection:Close
Content-Length:38
Content-Type:application/json; charset=utf-8
Date:Fri, 25 Feb 2011 09:18:53 GMT
Server:ASP.NET Development Server/10.0.0.0
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0

Это относится к действию С#/ASP.NET MVC3, которое выглядит следующим образом:

[Authorize]
public JsonResult SaveSetting(string settingName, string settingValue)
{
    try
    {
        repository.SaveSettingForUser(CurrentUser, settingName, settingValue);
    }
    catch (Exception ex)
    {
        return Json(new { Result = CurrentUser.IsAdmin() ? "Failed :" + ex.Message : "Failed" });
    }
    return Json(new { Result = string.Format("Set {0} to {1}.", settingName, settingValue) });
}

который, согласно хром, возвращает это:

{"Result":"Set bookFontSize to 10.5."}

который выглядит для меня законным json. Тем не менее, я получаю эту ошибку в chrome:

Uncaught SyntaxError: Unexpected token :

и этот в IE 7 и 8:

An error has occurred in the script on this page.
Line: 67456553
Char: 10
Error: Expected ';'
Code: 0
URL: http://localhost:1227/Read/116/1

У меня определенно нет 67 миллионов строк кода:)

В любом случае, кто-нибудь знает, что здесь происходит? Мое предупреждение не запускается. IE никогда не получает запрос, но Chrome делает.

Я думаю, что эта функция действительно работала с предыдущей версией jQuery давным-давно с настройкой $.ajaxSettings.traditional = true, но теперь она не работает (jQuery 1.5.1) с или без этой настройки.

Обновление. Я получил его работу. Я прошел через javascript с помощью отладчика. По какой-то причине во время вызова .ajax() в jQuery он перешел в jquery.validate.js. Зачем это делать? У меня был файл, но он нигде не использовался. Я устранил ошибку, просто не ссылаясь на jquery.validate.js. Но такого рода отстой, потому что, если я хочу использовать функции проверки в будущем?

Итак, теперь мой вопрос: "Почему в моем проекте есть jquery.validate.js?"

Обновление 2. В jquery.validate.js есть ошибка, которая теперь исправлена ​​в fork этого проекта на github. См. Мой ответ для деталей. Я даже не использовал функции проверки этого файла, просто включив его в страницу для последующего использования. Это мешает и ломает вещи. Обратите внимание на автора jquery.validate.js относительно исправления: "Исправляет код jQuery 1.5 с помощью jQuery.ajaxSettings, а не window.ajaxSettings(да, это было глупо)".

4b9b3361

Ответ 1

Я понял это!

Это ошибка в jquery.validate.js. Он повторяется и документируется здесь: http://bugs.jquery.com/ticket/8064

Автор обратился к проблеме 2 февраля 2011 года, но это исправление еще не внесло официального релиза плагина (по состоянию на 25 февраля 2011 г. и jQuery Validate 1.7). Если вы хотите, чтобы jQuery 1.5+ JSON работал при использовании проверки jquery, вы должны загрузить исправленный плагин проверки.

https://github.com/jaubourg/jquery-validation/raw/master/jquery.validate.js https://github.com/jaubourg/jquery-validation/raw/master/jquery.validate.min.js

Если вы находитесь здесь из Google, и приведенные выше ссылки больше не работают, вероятно, будет работать обновление до версии проверки, которая больше 1,7. Кроме того, перейдите сюда https://github.com/jaubourg/jquery-validation и возьмите последнюю версию из репозитория.

2011-08-31 Обновление: похоже, что они больше не используют эту ссылку GitHub. Я думаю, что это то, что вам нужно.

Ответ 2

Вы объявили сообщение как json, поэтому результат должен быть автоматически оценен.

Тем не менее, попытайтесь оценить результат перед предупреждением внутри скобок предупреждения

eval(data.Result)

Ответ 3

Может ли быть так, что имена ключевых объектов объекта динамически задаются в некоторых браузерах? Попробуйте изменить saveSetting на следующее:

function saveSetting(settingName, settingValue) {
    $.post(
        appUrl + "Account/SaveSetting",
        { "settingName": settingName, "settingValue": settingValue },
        function (data) {
            alert(data.Result);
        },
        "json"
    );
}

Или, возможно, изменить имя аргумента на что-то другое, кроме имени ключа объекта:

function saveSetting(settingNameArg, settingValueArg) {
    $.post(
        appUrl + "Account/SaveSetting",
        { settingName: settingNameArg, settingValue: settingValueArg },
        function (data) {
            alert(data.Result);
        },
        "json"
    );
}

Ответ 4

Вы возвращаете неправильный JSON с сервера. Ваш возвращенный JSON имеет некоторый управляющий символ в Result. Порекомендовал бы отправлять строку без new String.format

Ответ 5

Никогда не указывайте URL-адрес жесткого кода. Всегда используйте помощники URL при работе с URL-адресами. Также не указывайте абсолютные URL-адреса, поскольку jQuery считает, что это JSONP (обратите внимание на параметр callback=jQuery151022712289774790406_1298625531801 в вашем запросе), а ответ - только JSON:

function saveSetting(settingNameArg, settingValueArg) {
    $.post(
        '<%= Url.Action("SaveSetting", "Account") %>',
        { settingName: settingNameArg, settingValue: settingValueArg },
        function (data) {
            alert(data.Result);
        },
        'json'
    );
}

Также обратите внимание, что ваши аргументы функции называются settingNameArg и settingValueArg, тогда как в вашем коде вы использовали settingName и settingValue.

Ответ 6

Я использую это:

// The Actionresult is being called by an Ajax Call:
    public ActionResult SomePartial(Object model)
    {
    return Json(new { state="Success", date="some data" });
    }

//OnSuccess of the Ajax Call:
    function OnSuccess(ajaxContext) {
    var result = eval(ajaxContext);
    if (result.state == "Success") {
    console.log(result.data)
    }
            else {
                // ERRORS
            }

        }

это возвращает действительный объект json и отображает его:)

также nb для проверки вашего json http://jsonlint.com/