2013-12-15 70 views
11

我有以下代碼:

$("#loginSubmitButton").on("click",function(){ 
    var loginUserDetails = { 
    email: $("#email").val(), 
    password: $("#password").val() 
    }; 

    //Send the AJAX request to authenticate the user 
    $.ajax({ 
    type: "POST", 
    url: "/somewebservice/v1/users/authenticate", 
    data: JSON.stringify(loginUserDetails), 
    contentType: "application/json;charset=UTF-8", 
    dataType: "json", 
    }).done(function() { 
     $("#loginResult").text("Login successful"); 
    }) 
    .fail(function() { 
     $("#loginResult").text("Login failed"); 
    }); 

}); 

按照jQuery的文檔(除非我理解的東西不正確地)我希望做被解僱,如果我收到200 OK從我的網絡服務器。但是,在Chrome控制檯中,我可以看到200 OK響應,但jquery似乎觸發了失敗處理程序。

有沒有人有任何想法我可能會做錯在這裏?

+3

檢查錯誤消息中失敗 –

+3

大概'數據類型:「JSON」' – Musa

+0

你不需要字符串化loginUserDetails .. 。 – yoyo

回答

2

需要從的dataType刪除:「JSON」,

dataType: "json" 
+0

刪除了逗號,但仍然是相同的問題。如何在失敗中檢查錯誤消息? – tsure

0

應該清理您的問題,一般一對夫婦提示的幾件事情。

  1. 不要點擊提交按鈕。您應該等待表單上的提交事件。

  2. $.ajaxdata選項不期待JSON字符串。它想要一個帶有名稱和值對象的序列化字符串或數組。您可以使用.serialize().serializeArray()輕鬆創建其中的任意一種。

這是我在想你的腳本。

$('#form-with-loginSubmitButton').on('submit', function(e){ 


    e.preventDefault(): 

    var $form = $(this), 
     data = $form.serializeArray(); 

    $.ajax({ 
    type: "POST", 
    url: "/somewebservice/v1/users/authenticate", 
    data: data 
    }).done(function(result){ 
    console.log(result); 
    }); 

}); 
+0

任何我不應該聽點擊事件的原因?我的web服務期望有JSON參數的POST,所以我使用了JSON.Stringify。那是問題嗎? – tsure

+0

您可以在不點擊的情況下提交表單而不點擊或「點擊」按鈕。在某些情況下,瀏覽器可能會掩蓋這些問題,但我不會依賴它。 –

26

您需要刪除:

dataType: "json"

+4

美麗!你救了我! –

+0

我應該看過這個之前,我重拍從我自己的網站的一部分,事情是,如果你不返回一個json數據類型jquery把這當做一個失敗。謝謝。 –

5

如果你的服務器返回一個JSON響應空字符串(即使有200 OK),jQuery的將其視爲失敗。從v1.9開始,一個空字符串被認爲是無效的json。

無論是事業,一個好地方看的是「數據」參數傳遞給回調:

$.ajax(..).always(function(data) { 
    console.log(JSON.stringify(data)); 
}); 

它的內容會給你的什麼是錯的理解。

15

有很多的建議,以去除

dataType: "json" 

雖然我承認這個作品它可能忽略了潛在的問題。這很可能是由解析器錯誤引起的(瀏覽器解析json響應)。首先檢查.always()或.fail()中的XHR參數。

假設它是一個解析器失敗,那爲什麼?也許返回字符串不是JSON。或者在響應開始時它可能是錯誤的空白。考慮在小提琴手中看看它。煤礦是這樣的:

Connection: Keep-Alive 
Content-Type: application/json; charset=utf-8 

{"type":"scan","data":{"image":".\/output\/ou... 

在我而言,這是用PHP噴涌而出不需要的字符(在這種情況下,UTF文件的BOM)的問題。一旦我刪除這些它解決了問題,同時也保持

dataType: json 
+2

太棒了!刪除'dataType'只是一個解決方法。修復數據源是真正的修復。 –

+0

不錯。我認爲我的問題是服務器返回'text/html'而不是JSON響應。 – Harvey

0

ajax URL必須是相同的域。您無法使用AJAX訪問跨域腳本。這是因爲同源政策。
添加「數據類型:JSONP」實現跨域通信下面的代碼

使用

$.ajax({ 
     URL: cross domain 

     dataType: 'jsonp' 
      // must use dataType:JSONP to achieve cross domain communication, otherwise done function would not called. 
      // jquery ajax will return "statustext error" at }).always(function(data){} 


}).always(function(data){ 
     alert(JSON.stringify(data)); 
    }