简体   繁体   English

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

[英]jQuery.ajax success callback function not executed

I have a JavaScript Ajax call (jQuery.ajax), that does not execute the success callback function. 我有一个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);
        }
    });

I see in firebug, that the request is posted and the correct result in terms of the json is returned as expected. 我在firebug中看到,请求已发布,并且按照预期返回了json方面的正确结果。 What is wrong? 怎么了?

For many times I have encountered similar problems and most of the time the reason was a malformed json. 很多时候我遇到过类似的问题,而且大部分时间都是因为json格式不正确。 Try getting the result as text data type to see whether this is your problem. 尝试将结果作为文本数据类型来查看这是否是您的问题。

Also, I'd like to ask if you're using a parameter like "&jsoncallback=?" 另外,我想问你是否使用像“&jsoncallback =?”这样的参数。 in your url, since your data type is jsonp instead of simple json. 在你的网址中,因为你的数据类型是jsonp而不是简单的json。

Your $.ajax call with dataType: 'jsonp' could work in these scenarios: 你的$.ajax调用dataType: 'jsonp'可以在这些场景中工作:

  1. You are calling a url on the same domain of your page. 您正在网页的同一个域中调用网址。
  2. You are calling a url out of your domain of your page that supports callback 您正在调用支持回调的网页域名

If you are out of these two cases, you can't do anything since you can't make cross site XmlHttpRequest calls. 如果您处于这两种情况之外,则无法执行任何操作,因为您无法进行跨站点XmlHttpRequest调用。

This is an old question, but I suspect people still hit this. 这是一个古老的问题,但我怀疑人们仍然会这么做。

I fought this for some time, and eventually gave up and moved to the deferred model. 我打了一段时间,最终放弃并转移到延期模型。 (I've been using jQuery long enough that I was in the "old" way habits still...) As soon as I moved to a deferred model, things started to work. (我一直在使用jQuery,以至于我仍处于“旧”的习惯......)一旦我转移到延迟模型,事情就开始起作用了。 I have no idea why the old way didn't work, but no longer care. 我不知道为什么旧方法不起作用,但不再关心。 (This question pre-dates the new model.) (这个问题早于新模型。)

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

You need to have set async property to false. 您需要将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);
        }
    });

This just happened to one of my co-workers, so I figure I'd add my solution as well. 这恰好发生在我的一位同事身上,所以我想我也会添加我的解决方案。

We could see the ajax call being made, and could see the proper response coming back in Fiddler (status 200 / completely valid JSON), but it would never hit the error, success, or complete callbacks. 我们可以看到正在进行的ajax调用,并且可以看到Fiddler中返回的正确响应(状态200 /完全有效的JSON),但它永远不会出现错误,成功或完整的回调。 Adding async: false to the ajax call would make it work, but that wasn't really a proper solution. 在ajax调用中添加async:false会使其工作,但这不是一个真正合适的解决方案。 Additionally placing an alert directly after the ajax call (without the async: false), and waiting a few seconds once the alert was shown, would somehow force the ajax callbacks to work . 另外,在ajax调用之后直接发出警报(没有async:false),并在显示警报后等待几秒钟,会以某种方式强制ajax回调工作。 Very odd indeed... 确实很奇怪......

Turns out, the function with the ajax call was bound to an input of type="submit", which was the source of this odd behavior. 事实证明,带有ajax调用的函数被绑定到type =“submit”的输入,这是这种奇怪行为的来源。 Changing the input to type="button" corrected it. 将输入更改为type =“button”更正了它。

Jquery Ajax call to a servlet with mutliple parameters was not calling success or error even though the call was succesfull. Jquery Ajax调用具有mutliple参数的servlet,即使调用成功,也没有调用成功或错误。 It was bound to a submit button. 它被绑定到提交按钮。 Changing it returned a success event. 更改它返回了成功事件。

Here is my reference code in case someone needs it for reference. 这是我的参考代码,以防有人需要它作为参考。

$(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 with Bootstrap3 (Button reference) 带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 Reference 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));
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM