表单提交前验证短信验证码是否正确

自己做的一个用户注册的表单,注册需要验证手机号,会发送短信验证码,所以在用户填写完验证码之后点击注册,再提交表单之前先请求后台验证一下短信验证码是否正确,错误会有提示,正确就会提交表单注册.

前端使用thymeleaf模板,semantic UI框架,后台是spring boot

先看注册的form

<form class="ui form attached fluid segment" name="enrollInfo" id="enroll" th:action="@{/enroll}" method="post" th:onsubmit="'return validateMsgCode();'">
            <div class="ui error message">
                <div class="header" id="error">请求正确填写注册信息哦!</div>
            </div>
            <div class="field">
                <div class="ui left icon input">
                    <i class="user icon"></i>
                    <input type="text" name="username" placeholder="独一无二的用户名">
                </div>
            </div>
            <div class="field">
                <div class="ui left icon input">
                    <i class="mobile alternate icon"></i>
                    <input type="text" name="telPhone" placeholder="手机号">
                </div>
            </div>
            <div class="field">
                <div class="ui left icon input">
                    <i class="envelope square icon"></i>
                    <input type="text" name="msgCode" placeholder="短信验证码">
                    <button class="ui positive button msg" type="button" th:onclick="'getMsgNum(this)'">发送验证码</button>
                </div>
            </div>
            <div class="field">
                <div class="ui left icon input">
                    <i class="shield alternate icon"></i>
                    <input type="password" name="password" placeholder="6-16位的密码,可由数字、字符、字母组成">
                </div>
            </div>
            <button class="fluid teal ui button" type="submit">注册</button>
        </form>

这里采用的方法是在form标签中使用onsubmit,thymeleaf的写法是th:onsubmit="'return 执行函数()'",我js中的实现看下面代码

function validateMsgCode() {
    var result = false;
    var data = {
        telPhone: $("input[name='telPhone']").val(),
        msgCode: $("input[name='msgCode']").val()
    };
    syncAjaxData("POST", "/validateMsgCode", JSON.stringify(data), function (response) {
        console.log("result=" + response);
        if (response) {
            result = true;
        }else {
            console.log("验证码错误");
            $('.ui.form').form('add prompt', "msgCode", "验证码错误或超时");
        }
    });
    return result;
}

重点就在这里了

这里Ajax请求的后台就是一个短信的验证没什么可说的,Ajax是我封装了以下的,里面有一句重要的代码async: false,,就是要将Ajax设为同步的,这样才可以改变result的值,否则Ajax会新开一个异步线程去执行,这样影响不到函数里的变量,验证就没有作用了,
但我这里同步Ajax出现了一个新问题,就是如果验证错误,我会通过semantic中表单验证的方法给指定字段添加错误提示(具体使用方法可以参考官方文档),$('.ui.form').form('add prompt', "msgCode", "验证码错误或超时");,但我在测试中发现这个验证总是闪一下就没了,到现在不明白为什么,
就是下面这个样子,手速快,在它要没了的时候我给截了下来,

注册界面

这样确实是进行字段的验证,验证错误不会提交,正确就会提交注册,但闪一下就没了,这样肯定也是不行,
最后发现主要是onsubmit方法的原因,如果我使用异步Ajax,在一个异步的线程中执行,相当于跳出方法外执行就没有问题,但异步的做不到字段的验证,陷入了纠结中,表单验证和错误提示二者选一个,要么同步Ajax放弃错误提示,要么异步Ajax放弃验证,后者肯定是不行的,但前者的用户体验也会不好,最后想到的办法是二者我都要了,
具体实现就是写在onSubmit方法中写两个Ajax,一个异步一个同步,异步的用来做错误提示,同步用来做字段验证,修改后的js代码就是这样了

function validateMsgCode() {
    var result = false;
    var data = {
        telPhone: $("input[name='telPhone']").val(),
        msgCode: $("input[name='msgCode']").val()
    };
    ajaxData("POST", "/validateMsgCode", JSON.stringify(data), function (response) {
        console.log("result=" + response);
        if (!response) {
            console.log("验证码错误");
            $('.ui.form').form('add prompt', "msgCode", "验证码错误或超时");
        }
    });
    syncAjaxData("POST", "/validateMsgCode", JSON.stringify(data), function (response) {
        console.log("result=" + response);
        if (response) {
            result = true;
        }
    });
    return result;
}

先用一个异步的Ajax来做验证错误提示,再用一个同步的Ajax做字段验证,这样可以做到错误提示,并且起到表单验证的作用,缺陷就是多了一次重复的请求,但为了实现效果,多一次请求没有太大影响吧.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,559评论 18 139
  • HTML表单 在HTML中,表单是 ... 之间元素的集合,它们允许访问者输入文本、选择选项、操作对象等等,然后将...
    兰山小亭阅读 3,408评论 2 14
  • React中没有类似Angular那样的双向数据绑定,在做一些表单复杂的后台类页面时,监听、赋值、传递、校验时编码...
    tedyuen777阅读 9,838评论 1 23
  •   JavaScript 最初的一个应用,就是分担服务器处理表单的责任,打破处处依赖服务器的局面。   尽管目前的...
    霜天晓阅读 652评论 0 3
  • 如果不能像果树那样 惹人喜爱 也不是花儿 给大地带来芬芬 那就做一棵参天的大树吧 至少在炎热夏天为人们带来阴凉 如...
    宋炜阅读 202评论 0 1