无法从$ .post调用返回的jqXHR获取状态代码

时间:2016-09-26 06:36:48

标签: javascript jquery

我正在使用jQuery通过注册提交事件监听器来发布并将一行记录插入到表体的末尾。这是小提琴:https://jsfiddle.net/8jew8kk7/4/

$("form").submit(function(event) {
  event.preventDefault()

  jx = $.post('data.asp', 'action=add&' + $(this).serialize())
  console.log("jx=" + jx.status)
  if (jx.status == 404) {
    alert("404 not found")
    return false
  }
  tdstring = "<tr><td>" + $("input[name='pkeyEmployeeID']").val() + "</td><td>" + $("input[name='strFirstName']").val() + "</td><td>" + $("input[name='strLastName']").val() + "</td><td>" + $("input[name='dtmBirthDate']").val() + "</td><td>" + $("input[name='strHomePhone']").val() + "</td>"
  delstring = '<td><button type="button" name="action" value="del" onclick="del(this)" fid="' + $("input[name='pkeyEmployeeID']").val() + '">add</button></td></tr>'
  $(this).find('tbody').append($(tdstring + delstring).hide().fadeIn('normal'))
})

jx.status在运行时总是undefined。在Chrome控制台中执行x=$.post('data.asp').status时,我可以获得服务器返回的代码。这个片段有什么缺陷吗?

2 个答案:

答案 0 :(得分:1)

由于代码以异步方式运行console.log("jx= " + jx.status)在ajax请求完成之前运行,因此没有状态为jx对象,因此它返回undefined。要使用它,请在.always()函数内运行它。您还需要使用此$("input[name='pkeyEmployeeID']")而不是$("input[name='pkeyEmployeeID'")

这样的选择器
jx.always(function(){
    alert( jx.status)
    if (jx.status == 404) {
      alert("404 not found")
      return false
    }

  })

JSFIDDLE

答案 1 :(得分:1)

jQuery.post(或$ .post)方法返回一个promise对象。因此,如果您想从jqXHR获取数据,则必须从then(),always()或promise()方法获取数据。

jx = $.post('data.asp', 'action=add&' + $(this).serialize())
jx.always(function(data, textStatus, jqXHR){
    if(jqXHR.status == 200)
    //your code here
})
  

jQuery 1.5中$ .ajax()返回的jqXHR对象实现了Promise接口,为它们提供了Promise的所有属性,方法和行为(有关详细信息,请参阅Deferred对象)。这些方法接受$ .ajax()请求终止时调用的一个或多个函数参数。这允许您在单个请求上分配多个回调,甚至在请求完成后分配回调。 (如果请求已经完成,则立即触发回调。)

     

http://api.jquery.com/jQuery.ajax/#jqXHR

演示:https://jsfiddle.net/8jew8kk7/14/