2011-02-25 51 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/

相關問題