Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未执行jQuery.ajax成功回调函数_Javascript_Jquery_Ajax_Callback - Fatal编程技术网

Javascript 未执行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) {

我有一个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方面的正确结果按预期返回。有什么问题吗?

您的
$。使用
数据类型调用ajax
“jsonp”
可以在以下情况下工作:

  • 您正在页面的同一域上调用url
  • 您正在从您的页面域外调用一个url,该url支持

  • 如果没有这两种情况,您就什么也做不了,因为您无法进行跨站点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));
    }