Javascript 未执行jQuery.ajax成功回调函数
我有一个JavaScript Ajax调用(jQuery.Ajax),它不执行成功回调函数Javascript 未执行jQuery.ajax成功回调函数,javascript,jquery,ajax,callback,Javascript,Jquery,Ajax,Callback,我有一个JavaScript Ajax调用(jQuery.Ajax),它不执行成功回调函数 $.ajax({ url: target, contentType: 'application/json; charset=utf-8', type: 'POST', // type: 'GET', dataType: 'jsonp', error: function (xhr, status) {
$.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方面的正确结果按预期返回。有什么问题吗?您的
$。使用数据类型调用ajax
“jsonp”
可以在以下情况下工作:
如果没有这两种情况,您就什么也做不了,因为您无法进行跨站点XmlHttpRequest调用。我多次遇到类似问题,大多数情况下,原因是json格式错误。尝试以文本数据类型获取结果,看看这是否是您的问题
另外,我想询问您是否在url中使用了类似“&jsoncallback=?”的参数,因为您的数据类型是jsonp而不是简单的json。您需要将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);
}
});
这发生在我的一个同事身上,所以我想我也应该添加我的解决方案 我们可以看到ajax调用正在进行,并且可以看到Fiddler返回正确的响应(状态200/完全有效的JSON),但是它永远不会遇到错误、成功或完全的回调。将async:false添加到ajax调用中可以使其工作,但这并不是一个真正合适的解决方案。另外,直接在ajax调用之后放置一个警报(不带async:false),并在警报显示后等待几秒钟,会以某种方式强制ajax回调工作。真的很奇怪
事实证明,带有ajax调用的函数绑定到type=“submit”的输入,这就是这种奇怪行为的根源。将输入更改为type=“button”更正了它。这是一个老问题,但我怀疑人们仍然会碰到这个问题 我为此奋斗了一段时间,最终放弃了,转而采用延迟模式。(我使用jQuery的时间已经够长了,我仍然使用“旧”的方式……)当我转移到一个延迟模型时,事情就开始起作用了。我不知道为什么老办法不管用,但我不再在乎了。(此问题在新模型之前提出。)
参见。Jquery对具有多个参数的servlet的Ajax调用没有调用成功或错误,即使调用成功。它被绑定到一个提交按钮。更改它会返回一个成功事件 这是我的参考代码,以防有人需要它作为参考
$(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(按钮参考)
拯救
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));
}
受保护的void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
HashMap=newHashMap();
CustomerDAO custinfo=新CustomerDAO();
Gson Gson=新的Gson();
CustomerVO=新CustomerVO();
字符串[]myJsonData=request.getParameterValues(“输入[]”);
info(“在客户注册表中输入”+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(“电子邮件”,myJsonData[3]);
map.put(“地址”,myJsonData[4]);
put地图(“街道”,myJsonData[5]);
put地图(“城市”,myJsonData[6]);
map.put(“pincode”,myJsonData[7]);
map.put(“mainphone”,myJsonData[8]);
地图放置(“国家”,myJsonData[9]);
试一试{
vo=custinfo.saveCustomerInfo(map);
}捕获(例外e){
logger.info(“aftercall”+e.getMessage());
抛出新的ServletException(e);
}
setContentType(“应用程序/json”);
响应。setCharacterEncoding(“UTF-8”);
response.getWriter().write(Utility.convertPOJOtoJason(vo));
}
我看到的一个可能导致这种情况的问题是,如果托管页面和ajax目标位于不同的域上。这是可行的,你可以试试看;至少在现代浏览器中是这样。不过,我不认为$.ajax可以处理这个问题。无论如何,如果是跨站点请求,ajax调用首先不会返回。@Tgr你确定吗?Jquery ajax跨域调用会切换到Jsonp,将回调函数名替换为?在回调url参数时调用url,并在页眉中添加标记。在页眉中添加脚本标记不是AJAX调用。(不过,我不知道jQuery可以做到这一点——很酷。)在现代浏览器中,您可以进行实际的跨域AJAX调用。它将取决于目标服务器通过一个特殊的HTTP头授权给您,而他们通常不会这样做,因此它目前还没有什么实际应用。我正在谈论OP所要求的Jquery的Ajax调用。我遇到了同样的问题,主要是格式不正确的json。在jsonlint.com上验证您的JSON响应,确认它是有效的JSON。谢谢,我就是这样。如果页面在AJAX调用完成之前发回,就会发生这种情况。呼叫通常会很快失败,因此在我的页面进行回发之前,我只看到了错误消息。如果使用服务人员,快速响应可以使这种情况更频繁地发生。延迟模型避免了这种情况。见@MikeBaz的答案。
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));
}