Подтвердить что ты не робот

Не удалось выполнить функцию обратного вызова jQuery.ajax

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

ср. fooobar.com/questions/65486/...

Ответ 5

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

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

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

Ответ 6

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