从$返回的jqXHR中获取状态码失败.post调用

failed to get status code from returned jqXHR of $.post call

本文关键字:状态 失败 post 调用 获取 返回 jqXHR      更新时间:2023-09-26

我使用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时,我可以得到服务器返回的代码。这个片段有什么缺陷吗?

由于您的代码异步运行console.log("jx= " + jx.status)在ajax请求完成之前运行,因此没有statusfor jx对象这样的东西,因此它返回未定义。为了使用它,在.always()函数中运行它。此外,你需要使用选择器$("input[name='pkeyEmployeeID']"),而不是$("input[name='pkeyEmployeeID'")

jx.always(function(){
    alert( jx.status)
    if (jx.status == 404) {
      alert("404 not found")
      return false
    }
  })

JSFIDDLE

jQuery。Post(或$. Post)方法返回一个promise对象。因此,如果你想从jqXHR获取数据,你必须从then(), always()或fail()方法的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 object)。这些方法接受一个或多个函数参数,这些参数在$.ajax()请求终止时被调用。这允许您在单个请求上分配多个回调,甚至可以在请求完成后分配回调。(如果请求已经完成,则立即触发回调)

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

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