Jquery点击按钮 异步和同步提交表单

Jquery ajax提交表单到servlet示例

前台部分代码:

    <form class="addSud" method="post" action="">
        <table>
        <tr>
        <td class="textRight">姓名</td>
        <td colspan="2"><input type="text" id="name" name="name"></td>
        <td class="textRight">学号</td>
        <td colspan="2"><input type="text" id="studentId" name="studentId"></td>
        </tr>
        <tr>
            <td colspan="5">&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" id="addStudents" value="提交"></td>
        </tr>
    </table>
    </form>

ajax提交表单代码:

    //增加学生,异步提交学生表单
    $("#addStudents").click(function() {
        $.ajax({
            url: "addStudents.do",//要请求的服务器url 
            //这是一个对象,表示请求的参数,两个参数:method=ajax&val=xxx,服务器可以通过request.getParameter()来获取 
            //data:{method:"ajaxTest",val:value},  
            data: {
                name: $("#name").val(),
                studentId: $("#studentId").val(),
            },
            async: true,   //是否为异步请求
            cache: false,  //是否缓存结果
            type: "POST", //请求方式为POST
            dataType: "json",   //服务器返回的数据是什么类型 
            success: function(result){  //这个方法会在服务器执行成功是被调用 ,参数result就是服务器返回的值(现在是json类型) 
                if(result){
                    alert("true");
                }else{
                    alert("false");
                }
            }
          });
    });

web.xml配置代码:

  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>addStudents</servlet-name>
    <servlet-class>org.cms.students.addStudents</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>addStudents</servlet-name>
    <url-pattern>/addStudents.do</url-pattern>
  </servlet-mapping>

addStudents.java代码(采用POST提交方式):

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String name=request.getParameter("name");
        System.out.println(name);
        System.out.println("123456789");
        out.print("false");
    }

ajax提交表单

通过上面的配置后,我输入学生姓名然后提交表单,但是在myeclipse的控制台里并没有打印出姓名和字符串“123456789”,然后我就开始了疯狂的检查,检查了n遍,还是不知道错误出现在哪里,一次偶然的机会我发现了问题所在。我在ajax代码块后加了个alert()语句,奇迹出现了,浏览器弹出相应内容,myeclipse的控制台里打印出姓名和字符串“123456789”,这让我很是疑惑,在查阅大量博客和官方文档后,我才明白一切都是JQuery ajax的同步和异步提交的原因。
先来了解下JQuery ajax方法:

异步的理解:当代码执行到ajax部分时,它与ajax之后的外部代码是一起执行的,假如此时有外部代码要用到ajax中的返回值,而ajax的async属性为true(即此时ajax为异步),那么后续的外部代码是不可能能拿到ajax的返回值的,只有设置为同步即ajax的async属性为true,执行完ajax部分时,再接着执行后续代码时,才会在关系上产生连续性,则这样才能拿到其返回值。

然后我就将async设置为false,问题真的解决了,但是还是不知道为什么添加了alert语句即使是异步也可以打印出姓名和字符串?
继续查阅资料我自己的总结如下(欢迎各位大牛指点):

1、async:true时:当点击提交按钮时,执行点击事件里的代码语句,执行到ajax时,由于是异步执行,所以并不会阻塞后面语句的执行,因为后面没有语句了,所以可能由于ajax还没来得及执行完点击事件就结束了,自然就没有打印出姓名和字符串。如果在ajax后添加alert语句,点击事件就会被阻塞到这里,这时ajax就有充足的时间执行,所以控制台就能打印出姓名和字符串。我尝试去除外层的点击事件,直接执行ajax,这时不论同步或者异步都可以打印出姓名和字符串,可以证明我的猜想。
2、async:false时:当点击提交按钮时,也会执行点击事件里的代码语句,执行到ajax时,由于是同步执行,所以必须等ajax成功返回后才继续执行后面的代码,自然就能打印出姓名和字符串。

当然这些只是我个人的一些猜想,目前我还在查阅更多的资料来证明完善我的猜想,希望大牛们能指出我的错误,我一定虚心接受。

最近发现真正的原因是:
ajax本身就是异步的,发起ajax请求后,当前的js还会继续执行,如果你想通过ajax阻止提交,就不能在sumit事件中发起ajax,比如,搞个<input type='button'>(别用type=‘submit’,那个默认还是会提交表单,用button默认不会提交表单)。或者阻止按钮的默认事件,在点击事件结束前加return false。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值