2011-02-25 52 views
16

我在这里发现了一堆类似的问题,但在阅读它们并尝试了3个小时后,我发布了自己的帖子。我为重复道歉,但我不知道这里发生了什么。jQuery发布导致未捕获的SyntaxError:意外的令牌:

所以我有这个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) }); 
} 

其中,根据铬,返回此:

{"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修复jQuery 1.5-代码,而不是修复window.ajaxSettings(是的,那是愚蠢的)。”

回答

21

我想通了!

这是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

如果你在这里从谷歌和上面的链接不工作了,升级到版本验证的大于1.7可能会工作。或者,在这里转到https://github.com/jaubourg/jquery-validation并从存储库中获取最新版本。

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

+3

真棒找到。你救了我几个小时。 – CreativeNotice 2011-03-10 14:52:34

1

您将该帖子声明为json,所以必须自动评估结果。

然而,尝试警报之前评估结果警觉

eval(data.Result) 
+0

不幸的没有任何改变。 – Chris 2011-02-25 09:44:45

0

的括号内会不会是对象键名被动态地设置在一些浏览器?尝试改变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" 
    ); 
} 
+0

这些很容易尝试,所以我先去了你的!不幸的是,没有帮助。此外,我同时尝试:) – Chris 2011-02-25 17:45:35

0

您是从服务器返回不正确JSON。您返回的JSON在Result中有一些控制字符。将推荐发送一个字符串没有new String.format

+0

你怎么知道这一点?难道这个char只是切割和粘贴chrome工具的结果吗? – Chris 2011-02-25 17:48:01

0

从来没有硬编码的网址。处理网址时始终使用网址助手。也不提供如jQuery的认为这是JSONP绝对URL(请注意您的要求callback=jQuery151022712289774790406_1298625531801参数),而响应只是JSON:

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

也注意到,你的函数参数被称为settingNameArgsettingValueArg而inyour代码您正在使用settingNamesettingValue

+0

我的函数参数不叫'settingNameArg'和'settingValueArg'。你是说他们应该?使用这些名称没有区别。 该函数位于外部JS文件中,因此服务器端代码不可用。但appUrl变量的设置类似于由MVC处理的不同文件。我应该确保它省略了协议,方案和主机名? – Chris 2011-02-25 17:51:18

+0

我想你可能会对JSONP建议有所帮助。是什么导致jQuery认为需要附加该回调参数?该url参数应该是什么样子?我尝试了/ Account/SaveSetting和../Account/SaveSetting,每个结果都是回调参数。 – Chris 2011-02-25 18:09:34

0

我使用这个:

// 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/

相关问题