我正在使用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
时,我可以获得服务器返回的代码。这个片段有什么缺陷吗?
答案 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
}
})
答案 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()请求终止时调用的一个或多个函数参数。这允许您在单个请求上分配多个回调,甚至在请求完成后分配回调。 (如果请求已经完成,则立即触发回调。)