我是jQuery和Javascript的总菜鸟。
需要一些帮助。我有一个AJAX请求命中一个PHP脚本。如果数据被验证,php将返回一些JSON。如果有错误,它会返回一个带有错误文本的html字符串(如果需要,我可以将其更改为json响应,但我现在很高兴它作为html ...)
我遇到的问题是如何识别json响应并编写JS中的后续if else语句以确定下一步该做什么。
submitHandler: function(form) {
$.post( window.location, $("#checkoutCustomer").serialize(), function(data) {
// TODO: get this to respond to json response or html...
// need something here to detect presence of JSON in the post response
$('#checkoutCustomerResults').html(data); // the html response case
$(".continue_checkout_link").show(); // the json repsonse case
});
}
理想情况下,在成功方案(JSON)中,响应应该触发页面在浏览器中加载新URL,我该如何做?
答案 0 :(得分:2)
submitHandler: function(form) {
$.post( window.location, $("#checkoutCustomer").serialize(), function(data) {
if(typeof data === 'string')
$('#checkoutCustomerResults').html(data);
else if(typeof data === 'object')
$(".continue_checkout_link").show();
else
alert('Something else');
});
}
答案 1 :(得分:1)
我最近遇到了类似的要求。我的最终解决方案是将所有响应都作为JSON。所有答案都有status
个参数。 status
可以使用值success
,error
或redirect
,其余属性根据status
的值设置。例如,如果status == 'redirect'
,那么我可以期望有另一个名为redirect
的参数,其中包含要重定向到的URL。如果status == 'error'
那么我可以期待一个名为errors
的参数(在我的情况下,它包含更多带有所有错误字段的JSON,但在您的情况下,您可以将HTML放在那里)
编辑这里有一些代码可以澄清:
submitHandler: function(form) {
$.post(window.location, $('#checkoutCustomer').serialize(), function(data) {
if (data.status == 'redirect') {
window.location = data.redirect;
return;
}
else if (data.status == 'error') {
// data.errors will contain some HTML you set on the server side
// display it however you like
}
else if (data.status == 'success') {
// do whatever you want on success
}
else {
// handle unknown status, should never happen
}
}, 'json');
}
注意最后的'json'
:它是$.post
的第4个参数,并告诉jQuery期望JSON作为响应。这样,回调中的data
参数将包含已解析的JSON响应作为简单对象。
答案 2 :(得分:1)
我个人使用jQuery的功能来调用特定状态代码的特定处理程序。那当然要求服务器表现得很好并且实际上正确使用状态http状态代码即即。如果失败,则不返回200 OK
然后你会做这样的事情
$.ajax({
url:"enpoint of service",
dataType: "json",
statusCode: {
200: function(data) {
//handle success
},
500: funciton(){
//handle internal server error
}
}
});
或者您可以使用jqXHR对象完成并失败
$.ajax({
url:"enpoint of service",
dataType: "json"
}).done(function(data){
//handle success here
}).fail(function(){
//handle error here
}).always(function(){
//ecuted regardless of success or failure
});