我有一个 JavaScript Ajax 调用 (jQuery.ajax),它不执行成功回调函数。
$.ajax({
url: target,
contentType: 'application/json; charset=utf-8',
type: 'POST',
// type: 'GET',
dataType: 'jsonp',
error: function (xhr, status) {
alert(status);
},
success: function (result) {
alert("Callback done!");
// grid.dataBind(result.results);
// grid.dataBind(result);
}
});
我在 firebug 中看到,请求已发布,并且按照预期返回了正确的 json 结果。怎么了?
我多次遇到类似的问题,大多数时候原因是格式错误的 json。尝试以文本数据类型获取结果,看看这是否是您的问题。
另外,我想问一下你是否使用了像“&jsoncallback=?”这样的参数?在您的网址中,因为您的数据类型是 jsonp 而不是简单的 json。
您使用
$.ajax
进行 dataType: 'jsonp'
通话可以在以下情况下使用:
如果您不属于这两种情况,您将无法执行任何操作,因为您无法进行跨站点 XmlHttpRequest 调用。
这是一个老问题,但我怀疑人们仍然会遇到这个问题。
我为此奋斗了一段时间,最终放弃并转向延迟模型。 (我已经使用 jQuery 足够长的时间了,以至于我仍然保持着“旧”方式的习惯......)一旦我转向延迟模型,事情就开始起作用了。我不知道为什么旧方法不起作用,但不再关心。 (这个问题早于新模型。)
您需要将 async 属性设置为 false。
$.ajax({
url: target,
contentType: 'application/json; charset=utf-8',
type: 'POST', // or 'GET',
dataType: 'jsonp',
async: false,
error: function (xhr, status) {
alert(status);
},
success: function (result) {
alert("Callback done!");
// grid.dataBind(result.results);
// grid.dataBind(result);
}
});
这恰好发生在我的一位同事身上,所以我想我也应该添加我的解决方案。
我们可以看到正在进行的 ajax 调用,并且可以看到 Fiddler 中返回的正确响应(状态 200/完全有效的 JSON),但它永远不会遇到错误、成功或完成回调。在 ajax 调用中添加 async: false 可以使其工作,但这并不是一个真正合适的解决方案。另外,在 ajax 调用之后直接放置一个警报(没有 async: false),并在显示警报后等待几秒钟,会以某种方式强制 ajax 回调工作。确实很奇怪...
事实证明,带有 ajax 调用的函数被绑定到 type="submit" 的输入,这就是这种奇怪行为的根源。将输入更改为 type="button" 可以纠正它。
13 年后,jquery 还在这里!.
任何遇到过这种情况的人。确保您的 ajax 响应具有“200 OK”HTTP 状态。否则 jquery 不会认为它成功!
确保您的服务器脚本不会在请求和响应过程之间进行重定向。例如:中间件、其他涉及的功能、路由器规则等
这不适用于较新版本的 jQuery,但就我而言,我正在维护一个使用 jQuery v3.2.1 的旧产品。事实证明,我尝试使用异步回调,而早期版本不支持该回调。没有错误或任何东西,只是回调没有执行。
即使调用成功,对具有多个参数的 servlet 的 Jquery Ajax 调用也不会调用成功或错误。它绑定到一个提交按钮。更改它返回了成功事件。
这是我的参考代码,以防有人需要参考。
$(document).ready( function () {
$("#buttonSave").click(function() {
alert('incustsave');
var name = $("#custname").val();
var gstnumber = $("#gstnumber").val();
var custbizname = $("#custbizname").val();
var email = $("#email").val();
var address = $("#address").val();
var street = $("#street").val();
var city = $("#city").val();
var zip = $("#zip").val();
var phone = $("#phone").val();
var country = $("#ctry").val();
var inputArray = [name, gstnumber, custbizname, email, address, street, city, zip, phone, country];
var Success = false;
alert('added_button_and_dt');
$.ajax({
type: "POST",
url: "RegisterCustomerServlet",
data: {'input': inputArray},
dataType: 'json',
success: function (data) {
alert('sucess');
},
error: function (e) {
alert('error');
}
});
});
});
带有 Bootstrap3 的 HTML(按钮参考)
<!-- Button -->
<div class='wrapper text-center'>
<div class="btn-group">
<button type="button" id="buttonSave" class="btn btn-primary">Save</button>
</div>
</div>
Servlet 参考
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HashMap<String,String> map = new HashMap<String,String>();
CustomerDAO custinfo = new CustomerDAO();
Gson gson = new Gson();
CustomerVO vo = new CustomerVO();
String[] myJsonData = request.getParameterValues("input[]");
logger.info("in custregisterjsoninput" + myJsonData[0] + myJsonData[2] + myJsonData[3] + myJsonData[4]);
map.put("custname", myJsonData[0]);
map.put("getsnumber", myJsonData[1]);
map.put("custbizname", myJsonData[2]);
map.put("email", myJsonData[3]);
map.put("address", myJsonData[4]);
map.put("street", myJsonData[5]);
map.put("city", myJsonData[6]);
map.put("pincode", myJsonData[7]);
map.put("mainphone", myJsonData[8]);
map.put("country", myJsonData[9]);
try {
vo = custinfo.saveCustomerInfo(map);
} catch (Exception e) {
logger.info("aftercall"+e.getMessage());
throw new ServletException(e);
}
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(Utility.convertPOJOtoJason(vo));
}