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

问题描述 投票:0回答:8

我有一个 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 结果。怎么了?

javascript jquery ajax callback
8个回答
61
投票

我多次遇到类似的问题,大多数时候原因是格式错误的 json。尝试以文本数据类型获取结果,看看这是否是您的问题。

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


6
投票

您使用

$.ajax
进行
dataType: 'jsonp'
通话可以在以下情况下使用:

  1. 您正在调用与您页面相同的域上的网址。
  2. 您正在从支持 callback
  3. 的页面域中调用 URL

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


3
投票

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

我为此奋斗了一段时间,最终放弃并转向延迟模型。 (我已经使用 jQuery 足够长的时间了,以至于我仍然保持着“旧”方式的习惯......)一旦我转向延迟模型,事情就开始起作用了。我不知道为什么旧方法不起作用,但不再关心。 (这个问题早于新模型。)

参见。 https://stackoverflow.com/a/14754681/199172


1
投票

您需要将 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);
    }
});

0
投票

这恰好发生在我的一位同事身上,所以我想我也应该添加我的解决方案。

我们可以看到正在进行的 ajax 调用,并且可以看到 Fiddler 中返回的正确响应(状态 200/完全有效的 JSON),但它永远不会遇到错误、成功或完成回调。在 ajax 调用中添加 async: false 可以使其工作,但这并不是一个真正合适的解决方案。另外,在 ajax 调用之后直接放置一个警报(没有 async: false),并在显示警报后等待几秒钟,会以某种方式强制 ajax 回调工作。确实很奇怪...

事实证明,带有 ajax 调用的函数被绑定到 type="submit" 的输入,这就是这种奇怪行为的根源。将输入更改为 type="button" 可以纠正它。


0
投票

13 年后,jquery 还在这里!.

任何遇到过这种情况的人。确保您的 ajax 响应具有“200 OK”HTTP 状态。否则 jquery 不会认为它成功!

确保您的服务器脚本不会在请求和响应过程之间进行重定向。例如:中间件、其他涉及的功能、路由器规则等


0
投票

这不适用于较新版本的 jQuery,但就我而言,我正在维护一个使用 jQuery v3.2.1 的旧产品。事实证明,我尝试使用异步回调,而早期版本不支持该回调。没有错误或任何东西,只是回调没有执行。

相关:jQuery Ajax 异步函数不会在成功时触发


-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));
}
© www.soinside.com 2019 - 2024. All rights reserved.