Функция обратного вызова jQuery.ajax не выполнена - PullRequest
26 голосов
/ 07 мая 2010

У меня есть JavaScript-вызов Ajax (jQuery.ajax), который не выполняет функцию обратного вызова success.

$.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 возвращается, как и ожидалось. Что не так?

Ответы [ 6 ]

50 голосов
/ 07 мая 2010

Много раз я сталкивался с подобными проблемами, и большую часть времени причиной была неправильная форма json.Попробуйте получить результат в виде текстового типа данных, чтобы увидеть, является ли это вашей проблемой.

Кроме того, я хотел бы спросить, если вы используете параметр типа "& jsoncallback =?"в вашем URL, поскольку ваш тип данных - jsonp вместо простого json.

6 голосов
/ 07 мая 2010

Ваш $.ajax вызов с dataType: 'jsonp' может работать в следующих сценариях:

  1. Вы вызываете URL в том же домене вашей страницы.
  2. Вы вызываете URL из своего домена вашей страницы, который поддерживает обратный вызов

Если вы находитесь вне этих двух случаев, вы ничего не можете сделать, поскольку вы не можете совершать межсайтовые вызовы XmlHttpRequest.

2 голосов
/ 14 апреля 2015

Это старый вопрос, но я подозреваю, что люди все еще сталкиваются с этим.

Я боролся с этим в течение некоторого времени, и в конце концов сдался и перешел к отложенной модели.(Я использую jQuery достаточно долго, чтобы все еще придерживаться «старых» привычек…) Как только я перешел на отложенную модель, все начало работать.Я понятия не имею, почему старый способ не работает, но больше не волнует.(Этот вопрос предшествует новой модели.)

ср.https://stackoverflow.com/a/14754681/199172

1 голос
/ 08 декабря 2010

Необходимо установить для свойства 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);
        }
    });
0 голосов
/ 17 августа 2017

Jquery Ajax-вызов сервлета с параметрами mutliple не вызывал успех или ошибку, даже если вызов был успешным. Он был привязан к кнопке отправки. Изменение вернуло событие успеха.

Вот мой ссылочный код на случай, если кому-то понадобится его для справки.

$(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>

Справочник сервлета

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));
}
0 голосов
/ 05 марта 2015

Это только что произошло с одним из моих коллег, поэтому я решил добавить свое решение.

Мы могли видеть, как выполняется вызов ajax, и видеть, что правильный ответ возвращается вFiddler (статус 200 / полностью допустимый JSON), но он никогда не попадет в ошибку, успех или полный обратный вызов.Добавление async: false к вызову ajax заставит его работать, но это не совсем правильное решение.Кроме того, размещение оповещения непосредственно после вызова ajax (без async: false) и ожидание в течение нескольких секунд после отображения предупреждения каким-то образом заставило бы работать обратные вызовы ajax.Очень странно, действительно ...

Оказывается, функция с вызовом ajax была привязана к входу типа = "submit", который был источником этого странного поведения.Изменение ввода на type = "button" исправило его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...