2010-05-07 134 views
22

我有一个JavaScript Ajax调用(jQuery.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方面的正确结果。哪里不对?

+3

一个问题我已经看到了,可能会导致该方案是如果托管的网页和Ajax目标是在不同的领域。 – artlung 2010-05-07 08:30:28

+0

http://stackoverflow.com/questions/21368375/why-does-jquery-ajax-call-only-work-when-im-debugging-in-chrome 这个作品尝试它为我工作 – 2014-04-25 12:12:22

回答

44

很多时候我遇到过类似的问题,而且大部分时候,原因都是畸形的json。尝试将结果作为文本数据类型来查看这是否是您的问题。

此外,我想问你是否使用了像“& jsoncallback =?”这样的参数。在你的网址中,因为你的数据类型是jsonp而不是简单的json。

+8

我有相同类型的问题,主要是格式错误的json。在jsonlint.com验证您的JSON响应 – Adeel 2010-05-07 11:24:39

+1

我验证了它的有效JSON。 – 2010-05-07 12:31:38

+1

json而不是jsonp解决了它。谢谢。 – 2010-05-07 13:31:38

5

$.ajax电话与dataType: 'jsonp'可以在这些情况下工作:

  1. 要调用你的页面的同一个域的URL。
  2. 要调用一个URL你的网页的域名支持callback

如果你出的这两种情况下,你不能做任何事情,因为你不能使跨站点的XmlHttpRequest调用的。

+0

其实, 您可以;至少在现代浏览器中。不过,我不认为$ .ajax可以处理这个问题。 – Tgr 2010-05-07 08:59:21

+1

无论如何,如果它是一个跨站点请求,AJAX调用不会首先返回。 – Tgr 2010-05-07 09:01:18

+0

@Tgr你确定吗?jquery Ajax跨域调用切换到Jsonp,用回调函数名替代?在您的回调网址参数上调用网址并在页面标题中添加

1

这是一个古老的问题,但我怀疑人们仍然打这个。

我为此奋斗了一段时间,最终放弃并转移到延期模型。 (我一直使用jQuery的时间足够长,以至于我仍然处于“旧”的习惯......)当我转向延期模型时,事情就开始奏效。我不知道为什么旧的方式不起作用,但不再在意。 (这个问题是在新模型之前发布的。)

参考https://stackoverflow.com/a/14754681/199172

-1

即使调用成功,Jquery Ajax调用具有多参数的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'); 
      } 
     }); 
    }); 
}); 

HTML与Bootstrap3(按钮参考)

<!-- 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)); 
}