Не удалось выполнить функцию обратного вызова 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 возвращается, как ожидалось. Что не так?
Ответы
Ответ 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));
}