表单验证课堂笔记

饥人谷_李栋


1.远古时期
2.JS表单验证
3.JQuery表单验证
4.input很多
5.表单验证的思路


一、远古时期

没JS (后端的事情)

执行过程

  • 当你写了一个东西之后,通过表单的action传给server
  • server接收到这个post请求之后,
  • 去读你发送的usernameemail
  • 根据你的邮箱是否合法,再次渲染这个页面
  • 把不合法的信息写在下面
  • 在该提示的地方,加一行字
  • 我们提交表单的时候 会发一个请求
//html

 <body>
        请提交你的表单信息
        
        <form action="/" method="post">
            
            <div class="row">
                <input type="text">
            </div>
            <div class="row">
                <input type="text">
            </div>
            <div class="row">
                <button type="submit">提交</button>
            </div>
            <div class="output">
               {{ error}}
            </div>
        </body>
//router

        .get('/',indexCtrl.index)
        .post('/2',indexCtrl.post)
//服务器端 

    post方法
    post:function *(next){
        var username=this.request.body.username
        var email=this.request.body.email   //拿到提交的username 和email
        yield this.render('post.hbs',{
            username:username
            email:email
        var error=''
        if(email.indexOf('@')){   //如果邮箱里面不含@
            error:'邮箱不合法'
        }
        yield this.render('index.hbs',{ // 渲染 给信息error
            error:error
        })      // post 一样可以返回页面
        yield next;
        })
    get方法
    index:function *(next){  //  用这个方法响应  
        yield this.render('index.hbs')  // 把index渲染出来
        yield next;
    } 
    
    }
    

二、 JS表单验证

仅仅是email的校验,在客户端就可以做了 --js诞生的一个主>要目的 可以节省服务器带宽
不用提交 就可以知道错了

<script>
  var form= document.getElementById('form')
  form.addEventListener('submit',function(){//只支持ie
        var username=form.username.value
        var email=form.email.value
        var phone=form.phone.value
        var regExpPhone=/^\d+$/g
        if(regExpPhone.test(phone)){
            alert('手机格式不正确')
            e.preventDefault()
            return
        }
        if(email.indexOf('@')<0){
            alert('邮箱不合法')
            e.preventDefault()//  邮箱不合法的话 阻止默认事件 不跳转
            return
        }
  })
</script>

验证这件事 服务器一定要做

  • 如果把源代码改了 /如果用户吧JS禁用了
  • 所有从客户端来的消息都可能有问题
  • 前端的验证可以被绕过
  • 所有有可能被攻击的事情 全部用服务器做

比如金额 不能用JS校验 你要用服务器 看啊可能他账户里面有多少钱
然后 在花钱

三、JQuery表单验证

请求与响应里有

var regPhone=/^\d$/g
        if(!regPhone.test(phone)){
            alert('error')
            return // 如果错误 ,后面就不执行了
        }


        $.ajax({
            type: "POST",
            url: xxxx,
            data: {
                    name:name,
                    phone:phone
                },
                    success: function(response){//返回的字符串/或对象
                    console.log(response)
                    if(response.errorCode===0){
                    var data=response.data
                    var  name=response.name4
                    var  phone=response.phone4//这里的phone4就是服务器定的
                        alert('提交成功,姓名:'+name+'\n手机:'+phone)
                    }else{
                        alert('提交失败')
                    }
                    
                },
            error:function(){
                    alert('服务器出错了!')
            },
                    dataType: dataType
        });
 </script>
 

还是用JS验证
jquery没有关于正则、字符串的API
好处:能方便的构造一个post请求

四、input很多的时候

问题:
需要收集说有的input,一个一个的验证
解决方法:
用JQuery找到input,调用他的序列化方法:

 $('form').serialize()

验证的规则

 var rules={
    phone:function(value){
        if(value==''){
            return false
        } else{
            return true
            
        }
    }
 }
 var volid=true//整个表单的合法性
        $("form").find('input').each(function(index,node){//拿到form 找到说有的input 遍历他们
            var name=$(node).attr('name')  //node就是input 拿到他的name
            var varlue=$(node).val()
            var rule=rules[name]// 拿到他的规则  name是phone rule是function,否则是underfined
            if (!rule){  //如果rule是underfined
                //什么都不做
            }else{
                if (rule(value==false)) {
                    valid=false  //遍历完了 只要有一个不合法 valid就会变成false
                    return false  //each 里return false在不会继续往下走
                };
            }
        })

五、表单验证的思路

  • 确定验证规则和出错信息
  • 收集数据
  • 对数据进行验证
  • 输出最终结果
  • 提示出错信息

1.验证规则

比如
手机必须是11位的数字

/^\d{11}$/g

邮箱必须有@

val.indexOf('@')>=0

用户名必须是3-20位

val.length>=3&&val.length<=20

2.收集表单数据

代码:

$('form').find('input,select,textarea').each(function(index,node){
    var  name=$(node).attr(name)  //操作DOM对象 node.getAttribute('name')
    var  value=$(node).val()    //node.value()
})

以上代码问题:

  • 对于多个radiocheckbox(单选框、多选框)有相同的name->为了只选一个类型
  • 我们只要选中的 raidocheckboxselect
  • input type=“submit” 也可能被选中

解决办法:

  • 我们遍历的是input标签,当然会遍历name多遍, 可以先遍历一次 拿到所有不重复的name (所有->去重)
  • 被选中
    radio/checkbox ->checked
    select ->selected //默认选中
  • 禁用
    disabled //不能选
  • 明确input的type
    只取 text radio checkbox hidden password

知识点总结

.和getAttribute区别

获取自带的属性 可以用. 不是自带的可以用getAttribute()
.xx为JS 的状态 getAttribute(xxx) 为DOM的状态 默认情况下 是一致的

find(xxx)

在当前的元素集中,去找他的子元素,子元素只要满足xxx条件,就会被选中,得到一个新的元素集合
xxx可以是css3属性选择器

each(function(index,node){....this/node})遍历

里面的this就是node(DOM对象) ,index当前元素的第几个

input里的type有那些

text radio checkbox hidden button reset password submit

<input type='hidden'>

希望JS用,不想让用户看到的内容 比如JS用来传参 value很长...

<input type='password'>

内容看不见 不能复制

reset 

把填的所有内容 清理成初始化的值 ->value属性的值 reset 需要放到form里面

select  

里面包option 内容被option标签包裹 选中一个option 网页里的标签字符串不会变(selected不会显示) 但是JS的selected为true 因为 selecte标签没有selected属性

get(0)  

由JQuery对象变成DOM对象


待续...

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

推荐阅读更多精彩内容

  • 第一章 入门 基本功能:访问和操作 dom 元素,控制页面样式,对页面的事件处理,与ajax完美结合,有丰富的插件...
    X_Arts阅读 1,041评论 0 2
  • 一)jQuery九类选择器【参见jQueryAPI.chm手册】 目的:通过九类选择器,能定位web页面(HTML...
    奋斗的老王阅读 1,036评论 0 51
  • jQuery获取Select选择的Text和Value: 语法解释: 1. $("#select_id").cha...
    owen_he阅读 2,538评论 0 3
  • 如果小时候是个胖子,他可能是出没在阴暗胡同里,向低年级索要保护费的硬馒头。也可能是饱受众人嘲笑戏弄的软包子,有的包...
    虎子和小花阅读 640评论 5 2
  • 应该熟练应用基本属性及指令比如:ng-model ng-if ng-repeat ng-show 变量输出等 清...
    imoku阅读 151评论 0 0