jQuery$.ajax完成回调而未启动
jQuery $.ajax done callback not firing
我有以下代码:
$("#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文档(除非我理解错误),如果我从web服务器收到200 OK,我预计done会被解雇。然而,在chrome控制台中,我可以看到一个200 OK的响应,但jquery似乎触发了失败处理程序。
有人知道我在这里可能做错了什么吗?
您需要删除:
dataType: "json"
有很多建议可以删除
dataType: "json"
虽然我承认这是有效的,但它可能忽略了根本问题。这很可能是由解析器错误(浏览器解析json响应)引起的。首先检查.always()或.fail().中的XHR参数
假设它是一个解析器失败,那么为什么呢?也许返回字符串不是JSON。或者它可能是响应开头的错误空格。考虑在fiddler中看一看。我的是这样的:
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
{"type":"scan","data":{"image":".'/output'/ou...
在我的案例中,这是PHP喷出不需要的字符的问题(在本例中是UTF文件BOM)。一旦我删除了这些,它就解决了问题,同时还保留了
dataType: json
如果服务器返回json响应的空字符串(即使是200 OK),jQuery也会将其视为失败。自v1.9以来,空字符串被认为是无效的json。
不管是什么原因,一个很好的地方就是传递给回调的"data"参数:
$.ajax( .. ).always(function(data) {
console.log(JSON.stringify(data));
});
它的内容会让你了解问题所在。
需要从dataType中删除:"json",
dataType: "json"
ajax URL必须是同一个域。您不能使用AJAX访问跨域脚本。这是因为同源政策
添加"dataType: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));
}
一些应该解决问题的事情和一些一般提示。
-
不要听点击提交按钮。您应该等待表单上的提交事件。
-
$.ajax
的data
选项不需要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);
});
});
- $http.delete回调未在基本CRUD应用程序中启动
- jQuery$.ajax完成回调而未启动
- AngularJS指令未在变更回调时启动
- $.post.done回调未启动,但数据已发布到服务器
- 返回按钮回调函数在特定情况下失败或未启动
- 指令回调函数未从$watch内部启动
- jQueryAjax成功回调未启动,也未返回错误
- 为什么要用"立即:false”;不会't关闭弹出窗口并启动回调
- 乙烯基fs(gump文件流)未完成.dest写入,然后启动回调或promise
- 对$.ajax的调用没有从sinon.js fakeServer启动回调
- 如何防止启动排队的事件回调
- 为什么在打开模式内部的折叠时启动引导模式回调
- onChange回调未在React组件中启动
- SmoothState回调未启动
- 在没有回调的情况下在ajax加载后启动jQuery脚本
- 带有回调的 Javascript 函数,该回调将启动的对象作为参数传递
- 我可以嵌套Ajax调用吗?假设在前一个xmlhttprequest的回调中启动一个新的xmlhttprequest
- 使用reactjs启动node应用时webpack回调错误
- 为什么要设置动画's回调函数(完成)在启动时执行
- SoundCloud SDK/neneneba API回调事件未启动