jQuery.ajax成功回调函数未执行

我有一个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 =?”这样的参数。 在你的url中,因为你的数据类型是jsonp而不是简单的json。

使用dataType: 'jsonp' $.ajax调用可以在以下场景中工作:

  1. 您在网页的同一个域中调用了一个url。
  2. 您正在调用支持回调的网页域名

如果您不在这两种情况中,则无法执行任何操作,因为您无法进行跨站点XmlHttpRequest调用。

这是一个老问题,但我怀疑人们仍然会这样。

我打了一段时间,最终放弃并转移到延期模型。 (我一直在使用jQuery,以至于我仍处于“旧”的习惯……)一旦我转移到延迟模型,事情就开始起作用了。 我不知道为什么旧方法不起作用,但不再关心。 (这个问题早于新模型。)

比照 https://stackoverflow.com/a/14754681/199172

您需要将async属性设置为false。

 $.ajax({ url: target, contentType: 'application/json; charset=utf-8', type: 'POST', // type: '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回调工作。 确实很奇怪……

事实certificate,具有ajax调用的函数被绑定到type =“submit”的输入,这是这种奇怪行为的来源。 将输入更改为type =“button”更正了它。

Jquery Ajax调用具有mutliple参数的servlet,即使调用成功,也没有调用成功或错误。 它被绑定到提交按钮。 更改它返回了成功事件。

这是我的参考代码,以防有人需要它作为参考。

 $(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(按钮引用)

  

Servlet参考

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HashMap map = new HashMap(); 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)); }