javascript AJAX 成功回调函数未执行

7lrncoxx  于 2023-05-12  发布在  Java
关注(0)|答案(6)|浏览(175)

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

4zcjmb1e

4zcjmb1e1#

很多次我都遇到过类似的问题,大多数时候原因是一个畸形的JSON。尝试以文本数据类型获取结果,看看这是否是您的问题。
另外,我想问问你是否使用了像“&jsoncallback=?“,因为您的数据类型是jsonp而不是简单的json。

5jvtdoz2

5jvtdoz22#

您与dataType: 'jsonp'$.ajax调用可以在以下情况下工作:
1.您正在调用页面的同一域上的URL。
1.您正在从支持callback的页面的域中调用url
如果您不属于这两种情况,则无法执行任何操作,因为您无法进行跨站点XmlHttpRequest调用。

u0njafvf

u0njafvf3#

这是一个老问题,但我怀疑人们仍然会遇到这个问题。
我为此奋斗了一段时间,最终放弃了,转向了延迟模型。(我使用jQuery的时间已经足够长了,我仍然是“老”习惯...)当我转移到延迟模型时,事情就开始工作了。我不知道为什么旧的方式没有工作,但不再关心。(这个问题早于新模型。)
参见https://stackoverflow.com/a/14754681/199172

v2g6jxz6

v2g6jxz64#

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

roqulrg35#

我的一个同事也遇到了这种情况,所以我想我也应该添加我的解决方案。
我们可以看到正在进行 AJAX 调用,也可以看到Fiddler返回的正确响应(状态200 /完全有效的JSON),但它永远不会命中错误、成功或完整的回调。正在添加异步:false的 AJAX 调用将使它工作,但这并不是一个真正合适的解决方案。另外,在 AJAX 调用之后直接放置一个alert(没有async:false),并在显示警报后等待几秒钟,将以某种方式强制 AJAX 回调工作。很奇怪...
结果, AJAX 调用的函数被绑定到一个type=“submit”的输入,这就是这个奇怪行为的来源。将输入改为type=“button”纠正了它。

puruo6ea

puruo6ea6#

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

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

相关问题