jQuery在post响应中检测JSON,在if / else子句中重定向

时间:2012-05-28 05:50:59

标签: jquery ajax

我是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,我该如何做?

3 个答案:

答案 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可以使用值successerrorredirect,其余属性根据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
    });