zoukankan      html  css  js  c++  java
  • python_way day17 jQuery表单验证,事件绑定,插件,文本框架,正则表达式

    python_way day17

    1、jQuery表单验证

      dom事件绑定

      jquery事件绑定

      $.each return值的判断

      jquery扩展方法

      

    2、前段插件

    3、jDango文本框架

    4、正则表达式


    一,jQuery:表单验证:

    1、dom方法提交表单,并验证:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>表单验证</title>
        <style>
            .item{
                 250px;
                height: 60px;
                position: relative;
            }
            .item input{
                 200px;
            }
            .item span{
                display: inline-block;
                position: absolute;
                background-color: #D5023D;
                color: white;
                top: 20px;
                left:0;
                 203px;
            }
        </style>
    </head>
    <body>
        <form>
            <div class="item">
                <input class="c1" type="text" name="username" label="用户名">
                <!--<span>用户名不能为空</span>-->
            </div>
            <div class="item">
                <input class="c1" type="password" name="username" label="密码">
                 <!--<span>密码不能为空</span>-->
                <!--预先做测试使用,以后的效果就是让javascript往这里添加这个标签-->
            </div >
            <input type="submit" value="提交" onclick=" return CheckText();"> <!--人为绑定一个检查事件-->
        </form>
        <script src="js/jquery-3.1.0.js"></script>
        <script>
            function CheckText() {
                $('form span').remove();
                var flag = true;
                $('form .c1').each(function () {
                    //找到form标签中需要验证的标签
                    var val = $(this).val();  //获取input中的val
                    if(val.length<=0){
                        var label = $(this).attr("label");
                        var tag = document.createElement("span");
                        tag.innerText = label+"不能为空";
                        $(this).after(tag);  //把标签添加到这个标签的后面
                        flag = false;   //判断当前这个标签的内容如果是空就把flag制成false,不为空就不管了,让他是true,
                    }
                });
                return flag; //最后这个函数就可以return这个flag了,如果是true就可以提交表单,如果时候false就不提交
            }
        </script>
    </body>
    </html>
    版本一:所有的元素一起验证

    2、jQuery方法提交表单,验证方法:

      这种绑定事件的好处在于在阅览器里面看不到是谁绑定的这个事件。只有js知道谁绑定了时间

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>表单验证</title>
        <style>
            .item{
                 250px;
                height: 60px;
                position: relative;
            }
            .item input{
                 200px;
            }
            .item span{
                display: inline-block;
                position: absolute;
                background-color: #D5023D;
                color: white;
                top: 20px;
                left:0;
                 203px;
            }
        </style>
    </head>
    <body>
        <form>
            <div class="item">
                <input class="c1" type="text" name="username" label="用户名">
                <!--<span>用户名不能为空</span>-->
            </div>
            <div class="item">
                <input class="c1" type="password" name="username" label="密码">
                 <!--<span>密码不能为空</span>-->
            </div >
            <input type="submit" value="提交">
        </form>
        <script src="js/jquery-3.1.0.js"></script>
        <script>
            //绑定时机:1、需要form这个标签创建完才能绑定
            //        2、如果有大量内容需要加载,那我们就在框架加载完绑定会快很多
            $(function () {         //所以这里就使用了function这个自执行函数,在框架加载完就执行里面的绑定的函数
                //当页面框架加载完后,自动执行
                BindCheckValid();
            });
    
            function BindCheckValid() {
                $('form input:submit').click(function () {
                    $('form span').remove();
                    var flag = true;
                    $('form .c1').each(function () {
                        var val = $(this).val();
                        if(val.length<=0){
                            var label = $(this).attr("label");
                            var tag = document.createElement("span");
                            tag.innerText = label+"不能为空";
                            $(this).after(tag);
                            flag = false;
                            return false;   //如果有一个是false则退出整个循环,也就是只检测一个,下面的就不再检测了。效果:只显示当前不合法的报错
                    }
                    });
                    return flag;  //这里return false 就表示不再提交了,这里和dom "return BindCheckValid()"的reutrn false 是一个道理
                })
            }
        </script>
    </body>
    </html>
    版本二,jQuery绑定事件,验证表单

    3、each知识点:

    each循环

    <script>
        $.each([11,22,33,44], function (k, v) {
            if(k==2){
    
    return; //这里的reuturn只是相当与return了当前这个function匿名函数,这个each的循环没有结束 // return false; //我们如果想结束整个循环,需要写上return false ,each会判断你的reuturn,如果等于false就结束当前循环
       } console.log(v) }) </script>

     return:相当于continue。

     

    return false:相当于break。


     二、jQuery扩展:写成模块

    1、jquery 2种 插件机制:

    第一种:不依赖选择器直接可以使用的扩展

    jQuery代码:

    jQuery.extend({
      min: function(a, b) { return a < b ? a : b; },
      max: function(a, b) { return a > b ? a : b; }
    });
    

    结果:我们就多了这两个方法

    jQuery.min(2,3); // => 2
    jQuery.max(4,5); // => 5
    

     实例:

    扩展代码:

    function (jq) {
        jq.extend({
            "action":function (arg) {
                console.log(arg)
            }
        })
    })(jQuery);
    extend.js

    调取扩展代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <script src="js/jquery-3.1.0.js"></script>    //因为扩展也是依赖jquery的,所以这里需要加载jquery
        <script src="js/extend.js"></script>      //加载自己写的js模块
        <script>
            $.action('123')                //这一种是直接可以对js对象使用方法。不需要选择器之类的。
        </script>
    </body>
    </html>

      

    <script src="js/jquery-3.1.0.js"></script>
        <script>
            $.extend({   //extend是添加扩展的关键字
                action:function (arg,ths) {      // :前面是方法名,后面一个自执行函数,
                    ths.find('arg')         //这种方法如果需要选色器,就要把一个标签传进来,然后使用这个传进来的标签进行选择
              console.log(arg); //函数里面是这个方法的方法内容 } }); $.action('self extend','#form') //这种方法可以直接调取 action 这个方法 </script>

      

    第二种:需要先通过选择器来执行这个自定义方法

    jQuery代码:

    jQuery.fn.extend({     //关键字
      check: function() {  //check为方法名,自执行函数里面是自执行函数的方法
        return this.each(function() { this.checked = true; });         //this就代指的前面的选择器选择的内容
      },
      uncheck: function() {
        return this.each(function() { this.checked = false; });
      }
    });
    

    结果:这种方法我们需要先使用选择器来选定一个范围,然后再使用我们定义的方法

    $("input[type=checkbox]").check();
    $("input[type=radio]").uncheck();
    

    2、闭包:

    多个js扩展有可能全局变量或者函数名会有冲突的,这时候就徐亚使用闭包,来隔离这些冲突

    冲突例子:

    有两个extend,分别是extend1.js,extend2.js,这两个都没有闭包,他们的扩展中都调用了相同名字的函数  

    $.extend({
        action1:function () {
            f1()
        }
    })
    function f1() {
        console.log("extend1")
    }
    extend1
    $.extend({
        action2:function () {
            f1()
        }
    })
    function f1() {
        console.log("extend2")
    extend2 

     这两个文件中都调用了f1函数

    <body>
        <script src="js/jquery-3.1.0.js"></script>
        <script src="extend2.js"></script>   //这里我们先加载了extend2
        <script src="extend1.js"></script>   //这里我们后加载了extend1所以extend1的f1函数就覆盖了extend2里面的f1函数
        <script>
            $.action1()        //执行action1 
            $.action2()        //执行action2
    //最后我们得到的结果都是extend1里面的f1的结果
      </script> </body> </html>

    解决这个问题:

    /**
     * Created by han on 2016/8/30.
     */
    
    //演变1,不封装这些函数,会导致作用域的混乱
    $.extend({
        action1:function () {
            f1()
        }
    })
    function f1() {
        console.log("extend1")
    }
    
    //演变2 把所有的扩展都封装到函数中,然后去执行
    a = function (jq) {
       //因为把这些方法都包在函数里面了,所以这里面的作用域是什么都没有,这个函数执行时,需要jquery,我们就传入jquery
        jq.extend({
            action1: function () {
                f1()
            }
        });
        function f1() {
            console.log("extend1")
        }
    };
    a(jQuery);//我们就传入jquery
    // 这样我们就定义了一个函数,然后又让这个函数执行,如果不执行。里面的扩展方法就不会执行。
    
    
    //演变3.使用自执行函数来替代上面的那个方法,更清晰
    (function (jq) {
        jq.extend({
            action1: function () {
                f1()
            }
        });
        function f1() {
            console.log("extend1")
        }
    })(jQuery); // (function(jg)jq接受后面括号传过来的实参)<===(jQuery这个实参)
    解决的演变

    演变后实例

    (function (jq) {
        jq.extend({
            action1: function () {
                f1()
            }
        });
        function f1() {
            console.log("extend1")
        }
    })(jQuery); // (function(jg)jq接受后面括号传过来的实参)<===(jQuery这个实参)
    extend1.js
    (function (jq) {
        jq.extend({
            action2: function () {
                f1()
            }
        });
        function f1() {
            console.log("extend2")
        }
    })(jQuery); // (function(jg)jq接受后面括号传过来的实参)<===(jQuery这个实参)
    extend2.js
     <script src="js/jquery-3.1.0.js"></script>
        <script src="extend2.js"></script>
        <script src="extend1.js"></script>
        <script>
            $.action1();
            $.action2();
        </script>
    javascript 

     实例1:使用闭包,自定义js来执行一个输入验证。

    (function(jq){
        jq.fn.extend({
            BindValid:function (form) {
                //$(this):[ input.c1, input.c1 ]
                all_input= $(this);
                jq(form).find(':submit').click(function () {// 找到submit标签,绑定click单击事件
                    jq(form).find('span').remove();  //先把上一个错误的span提示标签删除
                    var flag = true;                 //定义flag一个返回变量
                    jq(all_input).each(function () {  //对 [ input.c1, input.c1 ] 标签做循环
                        var val = $(this).val();      //this就是当前循环到的input标签
                        if(val.length<=0){                      //如果小于0
                            var label = $(this).attr("label");      //获取这个标签的lable内容
                            var tag = document.createElement("span");  //创建一个span标签
                            tag.innerText = label+"不能为空";           //添入一个信息
                            $(this).after(tag);                         //在这个标签下面添加新建标签
                            flag = false;                               //因为没有填写内容所以给flag赋值成flase
                            return false;   //如果有一个是false则退出整个循环,也就是只检测一个,下面的就不再检测了。效果:只显示当前不合法的报错
                        }
                    });
                    return flag //返回true click这个事件就让继续提交,如果返回false就停止提交并报错
                })
            }
        })
    })(jQuery);
    my_extend.js
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>表单验证</title>
        <style>
            .item{
                 250px;
                height: 60px;
                position: relative;
            }
            .item input{
                 200px;
            }
            .item span{
                display: inline-block;
                position: absolute;
                background-color: #D5023D;
                color: white;
                top: 20px;
                left:0;
                 203px;
            }
        </style>
    </head>
    <body>
        <form id="form1">
            <div class="item">
                <input class="c1" type="text" name="username" label="用户名">
                <!--<span>用户名不能为空</span>-->
            </div>
            <div class="item">
                <input class="c1" type="password" name="password" label="密码">
                 <!--<span>密码不能为空</span>-->
            </div >
            <input type="submit" value="提交">
        </form>
        <script src="js/jquery-3.1.0.js"></script>
        <script src="js/my_extend.js"></script>
        <script>
            //绑定时机:1、需要form这个标签创建完才能绑定
            //        2、如果有大量内容需要加载,那我们就在框架加载完绑定会快很多
            $(function () {         //所以这里就使用了function这个自执行函数,在框架加载完就执行里面的绑定的函数
                //当页面框架加载完后,自动执行
    
                //首先先找到.item 下面的password 和 text 这两个标签,然后使用jquery的BindValid
                    $('.item :password,:text').BindValid('#form1'); //第二种jquery扩展方法,
                                                        // 在使用时将选择器匹配的标签直接传入后面的扩展jquery中
            });
        </script>
    </body>
    </html>
    表单验证_jQ_extend.html

    实例2:自定义检查内容,比如邮箱,电话类型,用户名长度,

    /**
     * Created by alex on 2016/8/28.
     */
    (function(jq){
    
        function ErrorMessage(inp,message){
            var tag = document.createElement('span');
            tag.innerText = message;
            inp.after(tag);
        }
    
        jq.extend({
            valid:function(form){
                // #form1 $('#form1')
                jq(form).find(':submit').click(function(){
    
                    jq(form).find('.item span').remove();   //delete error span tag
    
                    var flag = true;
                    jq(form).find(':text,:password').each(function(){  //loop eary text password tag
    
                        var require = $(this).attr('require');  //判断是否需要验证
                        if(require){
                            var val = $(this).val();
    
                            if(val.length<=0){          //如果没有填写任何内容
                                var label = $(this).attr('label');
                                ErrorMessage($(this),label + "不能为空");
                                flag = false;
                                return false;
                            }
    
                            var minLen = $(this).attr('min-len'); //如果长度不符合min-len的值
                            if(minLen){
                                var minLenInt = parseInt(minLen);
                                if(val.length<minLenInt){
                                    var label = $(this).attr('label');
                                    ErrorMessage($(this),label + "长度最小为"+ minLen);
                                    flag = false;
                                    return false;
                                }
                                //json.stringify()
                                //JSON.parse()
                            }
                            var phone = $(this).attr('phone'); //验证手机格式
                            if(phone){
                                // 用户输入内容是否是手机格式
                                var phoneReg = /^1[3|5|8]d{9}$/;
                                if(!phoneReg.test(val)){    //正则匹配val是用户输入内容是否不匹配
                                    var label = $(this).attr('label');
                                    ErrorMessage($(this),label + "格式错误");
                                    flag = false;
                                    return false;
                                }
                            }
                            // 1、html自定义标签属性
                            // 增加验证规则+错误提示
                        }
                    });
                    return flag;
                });
            }
        });
    })(jQuery);
    commons.js
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            .item{
                width: 250px;
                height: 60px;
                position: relative;
            }
            .item input{
                width: 200px;
            }
            .item span{
                position: absolute;
                top: 20px;
                left: 0px;
                font-size: 8px;
                background-color: indianred;
                color: white;
                display: inline-block;
                width: 200px;
            }
        </style>
    </head>
    <body>
    
        <div>
            <form id="form1">
                <div class="item">
                    <!--自定义require属性,如果为true就是需要验证不能为空,自定义属性min-len=6,用到了验证输入的长度为6-->
                    <input class="c1" type="text" name="username" label="用户名" require="true" min-len="6"/>
                </div>
                <div class="item">
                    <input  class="c1" type="password" name="pwd" label="密码"/>
                </div>
                <div class="item">
                    <!--自定义phone属性,如果是这个属性就是要填写手机,就要用正则去匹配内容是否为手机-->
                    <input  class="c1" type="text" name="phone" label="手机" require="true" phone="true"/>
                </div>
                <input type="submit" value="提交" />
            </form>
    
        </div>
    
        <script src="js/jquery-3.1.0.js"></script>
        <script src="js/commons.js"></script>
        <script>
            $(function(){
                $.valid('#form1');      //另一种绑定事件的方法,不用使用前面的选择器
            });
    
        </script>
    </body>
    </html>
    s4.html

    3、正则表达式

    1、定义正则表达式

    • /.../  用于定义正则表达式
    • /.../g 表示全局匹配
    • /.../i 表示不区分大小写
    • /.../m 表示多行匹配     //换了行重新匹配一次
      JS正则匹配时本身就是支持多行,此处多行匹配只是影响正则表达式^和$,m模式也会使用^$来匹配换行的内容)
    var pattern = /^Javaw*/gm;
    var text = "JavaScript is more fun than 
    JavaEE or JavaBeans!";
    result = pattern.exec(text)
    result = pattern.exec(text)
    result = pattern.exec(text)
    

      

    2、匹配

    JavaScript中支持正则表达式,其主要提供了两个功能:

    • test(string)     检查字符串中是否和正则匹配
    n = 'uui99sdf'
    reg = /d+/
    reg.test(n)  ---> true
     
    # 只要正则在字符串中存在就匹配,如果想要开头和结尾匹配的话,就需要在正则前后加 ^和$
    
    • exec(string)    获取正则表达式匹配的所有内容,如果未匹配,值为null,否则,获取匹配成功的数组。这个数组里面的第二个元素是匹配分组的内容
    获取正则表达式匹配的内容,如果未匹配,值为null,否则,获取匹配成功的数组。
     
    非全局模式(只匹配第一个)
        获取匹配结果数组,注意:第一个元素是第一个匹配的结果,后面元素是正则子匹配(正则内容分组匹配)
        var pattern = /Javaw*/;            //就是一个单词的开头和结尾
        var text = "JavaScript is more fun than Java or JavaBeans!";
        result = pattern.exec(text)
       ---> ["JavaScript"] var pattern = /(Java)w*/; //分组匹配 var text = "JavaScript is more fun than Java or JavaBeans!"; result = pattern.exec(text)
       ---> ["JavaScript", "Java"]    //索引的1位置就是分组匹配出来的元素
    全局模式(循环匹配所有匹配的) 需要反复调用exec方法,来一个一个获取结果,直到匹配获取结果为null表示获取完毕 var pattern = /Javaw*/g; var text = "JavaScript is more fun than Java or JavaBeans!"; result = pattern.exec(text)
       ---> ["JavaScript"]   ---> ["Java"]
       ---> ["JavaBeans"]
       var pattern = /(Java)w*/g; var text = "JavaScript is more fun than Java or JavaBeans!"; result = pattern.exec(text)
      ---> ["JavaScript", "Java"]
      ---> ["Java", "Java"]
      ---> ["JavaBeans", "Java"]

    3、字符串中相关方法 

    obj.search(regexp)                   获取索引位置,搜索整个字符串,返回匹配成功的第一个位置(g模式无效)
    obj.match(regexp)                    获取匹配内容,搜索整个字符串,获取找到第一个匹配内容,如果正则是g模式找到全部
    obj.replace(regexp, replacement)     替换匹配替换,正则中有g则替换所有,否则只替换第一个匹配项,
                                            $数字:匹配的第n个组内容;
                                              $&:当前匹配的内容;
                                              $`:位于匹配子串左侧的文本;
                                              $':位于匹配子串右侧的文本
                                              $$:直接量$符号
    

      

  • 相关阅读:
    回归,随缘写一些python心得吧
    划分树【有些东西,其实自己还不太会也要忍住把*装完】
    [codevs3273]两圆的交 计算几何
    10-12考试整理
    10-7考试整理
    [codevs1163]访问艺术馆
    [codevs2640]打印页数
    9-28 解题报告
    [CODEVS3323]时空跳跃者的封锁
    [codevs2442] kshort 经典题
  • 原文地址:https://www.cnblogs.com/python-way/p/5822497.html
Copyright © 2011-2022 走看看