JS_登录表单验证

JS_登录表单验证

JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证。

被 JavaScript 验证的这些典型的表单数据有:

  • 用户是否已填写表单中的必填项目?
  • 用户输入的邮件地址是否合法?
  • 用户两次输入的密码是否一致?
  • 用户是否在数据域中输入了文本?
  • 这里写了几个常用的表单验证项

  • 先看效果图吧

    表单验证.jpg
  • HTML

<body>
    <header>
        <div class="header-con clear-fix">
            <h1>
                <a href="#"></a>
            </h1>
            <p>欢迎注册</p>
            <div class="have-account">
                已有账号?
                <a href="#">请登录></a>
            </div>
        </div>
    </header>
    <div class="container clear-fix">
        <form class="form-signin" action="javascript:void(0)">
            <h2 class="form-signin-heading">请登录</h2>
            <!-- 用户名  -->
            <div class="inputArea">
                <label for="inputUsername" class="sr-only">用户名</label>
                <input type="text" id="inputUsername" class="form-control" maxlength="20" placeholder="支持中文、英文、数字、“-”、“_”的组合,4-20个字符">
                <span class="tip"></span>
            </div>
            <!-- 密码  -->
            <div class="inputArea">
                <label for="inputPassword" class="sr-only">设置密码</label>
                <input type="password" id="inputPassword" class="form-control" maxlength="20" placeholder="建议使用两种或两种以上字符组合">
                <span class="tip"></span>
            </div>
            <!-- 确认密码  -->
            <div class="inputArea">
                <label for="confirmPassword" class="sr-only">确认密码</label>
                <input type="password" id="confirmPassword" class="form-control" maxlength="20" placeholder="请再次输入密码">
                <span class="tip"></span>
            </div>
            <!-- 邮箱  -->
            <div class="inputArea">
                <label for="inputEmail" class="sr-only">邮箱</label>
                <input type="email" id="inputEmail" class="form-control" maxlength="50" placeholder="请绑定您的邮箱">
                <span class="tip"></span>
            </div>
            <!-- 登录按钮 -->
            <button id="signin" class="btn  btn-block" type="submit">立即注册</button>
        </form>
    </div>
</body>
  • CSS
<style>
    * {
        margin: 0;
        padding: 0;
    }
    
    .clear-fix:after {
        content: "";
        height: 0;
        clear: both;
        display: block;
        visibility: hidden;
        overflow: hidden;
    }
    
    header {
        height: 110px;
        background: url(https://misc.360buyimg.com/user/reg/3.0.0/css/i/headbg.jpg)repeat-x left bottom;
    }
    
    .header-con {
        width: 1210px;
        margin: 0 auto;
    }
    
    .header-con h1 {
        width: 160px;
        height: 50px;
        float: left;
        margin-top: 24px;
        background: url(https://misc.360buyimg.com/user/reg/3.0.0/css/i/icon.png);
    }
    
    .header-con p {
        float: left;
        height: 34px;
        line-height: 34px;
        font-size: 24px;
        color: #333;
        margin-top: 34px;
    }
    
    .have-account {
        float: right;
        font-size: 16px;
        margin-top: 55px;
        color: #999;
    }
    
    .have-account a {
        color: #e22;
        text-decoration: none;
    }
    
    .have-account a:hover {
        text-decoration: underline;
    }
    
    .container {
        margin: 50px auto;
    }
    
    .form-signin {
        width: 400px;
        margin: 0 auto;
    }
    
    .inputArea {
        border: solid 1px #ddd;
        width: 398px;
        height: 52px;
        position: relative;
        margin-bottom: 35px;
    }
    
    .inputArea:hover {
        border-color: rgb(121, 120, 120);
    }
    
    .inputArea label {
        width: 70px;
        height: 52px;
        display: block;
        float: left;
        font-size: 14px;
        text-align: justify;
        color: #666;
        line-height: 50px;
        padding-left: 20px;
        padding-right: 40px;
        text-align-last: justify;
        -moz-text-align-last: justify;
    }
    
    .inputArea label:after {
        display: inline-block;
        content: '';
        overflow: hidden;
        width: 100%;
        height: 0;
    }
    
    .form-control {
        width: 230px;
        height: 52px;
        border: none;
        outline: none;
    }
    
    .tip {
        position: absolute;
        display: block;
        font-size: 14px;
        padding-top: 4px;
        padding-left: 10px;
        color: orangered;
    }
    
    .btn-block {
        background: #e2231a;
        color: #fff;
        border: none;
        outline: none;
        width: 100%;
        height: 54px;
        line-height: 54px;
        text-align: center;
        cursor: pointer;
        font-size: 16px;
    }
    
    .btn-block:hover {
        background: #c81623;
        color: #eababc;
    }
    
    .success {
        border-color: yellowgreen!important;
    }
    
    .failed {
        border-color: orangered!important;
    }
</style>
  • JavaScript
var validateData = {
    "#inputUsername": {
        validFn: validateUsername,
        failedTip: "支持中文、英文、数字、“-”、“_”的组合,4-20个字符"
    },
    "#inputPassword": {
        validFn: validatePassword,
        failedTip: "建议使用字母、数字和符号两种及以上的组合,6-20个字符"
    },
    "#confirmPassword": {
        validFn: confirmPassword,
        failedTip: "两次输入密码不符"
    },
    "#inputEmail": {
        validFn: validateEmail,
        failedTip: "请输入正确的邮箱"
    }
}

function $(selector) {
    var ele = null;
    return (ele = document.querySelectorAll(selector)).length === 1 ? ele[0] : ele;
}

function validate(value, validFn, tip) {
    this.nextElementSibling.innerHTML = "";
    this.parentNode.style.borderColor = "#ddd";
    validFn(value) ? success.call(this) : failed.call(this, tip);
}

function success() {
    // 给当前元素 , 加上class名 success;
    // alert("成功验证");
    if (/failed/.test(this.parentNode.className)) {
        this.parentNode.className = this.parentNode.className.replace("failed", "success")
    } else {
        this.parentNode.className += /success/.test(this.parentNode.className) ? "" : " success";
    }
    this.nextElementSibling.innerHTML = "";
}

function failed(tip) {
    // alert("失败验证");
    if (/success/.test(this.parentNode.className)) {
        this.parentNode.className = this.parentNode.className.replace("success", "failed")
    } else {
        this.parentNode.className += /failed/.test(this.parentNode.className) ? "" : " failed";
    }
    this.nextElementSibling.innerHTML = tip;
}

function validateUsername(value) {
    var reg = /^[\u4e00-\u9fa5a-zA-Z0-9\-_]{4,20}$/;
    return reg.test(value)
}

function validatePassword(value) {
    var passwordLevel = 0;
    var passwordLevelReg = {
        num_reg: /\d/,
        letter_reg: /[a-zA-Z]/,
        symbol_reg: /[^0-9a-zA-Z]/
    }
    for (var attr in passwordLevelReg) {
        if (passwordLevelReg[attr].test(value)) {
            passwordLevel++;
        }
    }
    return passwordLevel >= 2 && /[\s\S]{6,20}/.test(value);
}

function confirmPassword(value) {
    var password = inputPassword.value;
    if (password === "") {
        return false;
    }
    // 如果password不为空;
    return value === password
}

function validateEmail(value) {
    var reg = /^\w{4,20}@[0-9a-zA-Z]{2,20}\.(com|cn|net)$/;
    return reg.test(value)
}

function handlerBlur(validFn, tip) {
    return function() {
        // 取值 ;
        var value = this.value;
        validate.call(this, value, validFn, tip)
    }
}

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

推荐阅读更多精彩内容