【问题标题】:jQuery post causes Uncaught SyntaxError: Unexpected token :jQuery post 导致 Uncaught SyntaxError: Unexpected token :
【发布时间】:2011-02-25 09:33:00
【问题描述】:

我在这里发现了一堆类似的问题,但是在阅读了 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

这是一个 C# / 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) });
}

根据 chrome,它会返回:

{"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

我绝对没有 6700 万行代码 :)

不管怎样,有人知道这里到底发生了什么吗?我的警报没有运行。 IE 从未真正发出请求,但 Chrome 会。

我认为这个函数实际上在很久以前使用之前版本的 jQuery,设置 $.ajaxSettings.traditional = true,但现在不管有没有这个设置它都不起作用(jQuery 1.5.1)。

更新:我搞定了。我用调试器逐步完成了 javascript。出于某种原因,在 jQuery 中调用 .ajax() 期间,它进入了 jquery.validate.js。为什么会这样做?我有这个文件,但没有在任何地方使用它。我通过不再引用 jquery.validate.js 来消除错误。但是这样很烂,因为如果我以后想使用验证功能怎么办?

所以我现在的问题是“为什么在我的项目中使用 jquery.validate.js 会搞砸一切?”

更新 2:jquery.validate.js 中有一个错误,现已在 github 上该项目的一个分支中修复。有关详细信息,请参阅我的答案。我什至没有使用该文件的验证功能,只是将它包含在页面中以供以后使用。它妨碍并破坏事物。 jquery.validate.js 的作者关于修复的注释:“通过使用 jQuery.ajaxSettings 而不是 window.ajaxSettings 修复 jQuery 1.5 代码(是的,这很愚蠢)。”

【问题讨论】:

    标签: javascript asp.net-mvc jquery


    【解决方案1】:

    我明白了!!!

    这是 jquery.validate.js 中的一个错误。在此重复并记录:http://bugs.jquery.com/ticket/8064

    作者已于 2011 年 2 月 2 日解决了该问题,但此修复尚未成为插件的正式版本(截至 2011 年 2 月 25 日和 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 并且上述链接不再起作用,则升级到 validate 版本大于 1.7 可能会起作用。或者,前往https://github.com/jaubourg/jquery-validation 并从存储库中获取最新版本。

    2011-08-31 更新:看起来他们不再使用那个 GitHub 链接了。 I think this is what you need.

    【讨论】:

    • 很棒的发现。你救了我几个小时。
    【解决方案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的字符串

    【讨论】:

    • 你怎么知道的?难道这个char只是chrome工具剪切粘贴出来的结果?
    【解决方案5】:

    永远不要硬编码网址。处理 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'
        );
    }
    

    还请注意,您的函数参数被称为 settingNameArgsettingValueArg,而在您的代码中您使用的是 settingNamesettingValue

    【讨论】:

    • 我的函数参数没有被称为settingNameArgsettingValueArg。你说他们应该是?使用这些名称没有区别。该函数在外部 JS 文件中,因此服务器端代码不可用。但是 appUrl 变量在由 MVC 处理的不同文件中进行了类似设置。我应该确保它省略了协议、方案和主机名吗?
    • 我认为您可能对 JSONP 建议有所了解。是什么导致 jQuery 认为它需要附加该回调参数?该 url 参数应该是什么样的?我将其作为 /Account/SaveSetting 和 ../Account/SaveSetting 进行了尝试,每个结果都在回调参数中。
    【解决方案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/

    【讨论】:

      猜你喜欢
      • 2011-04-02
      • 1970-01-01
      • 2019-11-29
      • 1970-01-01
      • 2016-04-06
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多