day 032 JQuery进阶2

本文介绍了JQuery中的事件冒泡及阻止方法、事件委托的概念与应用、元素节点操作技巧,并通过实例展示了表单验证的过程。

继续JQuery的学习,今天学习了JQuery事件冒泡,事件委托,元素节点操作,JavaScript中的正则表达式以及一个表单验证的实例。

事件冒泡

  • 子元素的事件被触发之后,会向上级传导,一级一级触发父级,爷爷级元素的事件,像冒泡泡一样
  • 阻止事件冒泡的方法
    • event.stopPropagation
    • return false
  • 事件冒泡的作用
    • 允许多个操作被集中处理(把事件处理器添加到一个父级元素上,避免把事件处理器添加到多个子集元素上)
    • 在对象层的不同级别捕获事件

这里写图片描述
这里写图片描述

     <style>
        .grandpa{
            width: 300px;
            height: 300px;
            background-color: aqua;
        }
        .parent{
            width: 200px;
            height: 200px;
            background-color: blue;
        }
        .son{
            width: 100px;
            height: 100px;
            background-color: red;
        }
    </style>
    <script src="../代码/js/jquery-1.12.4.min.js"></script>
    <script>
        $(function(){
            $('.son').click(function(event){
                console.log("儿子元素的点击事件被触发了");
                // return false; // 父级元素和爷爷级元素的事件都不会被触发
            })
            $('.parent').click(function(event){
                console.log('爸爸元素的点击事件被触发了');
                // 阻止事件冒泡
                // 方法一,使用event对象的stopPropagation()方法
                // event.stopPropagation();
                // 方法二:使用return false
                return false;
            })
            $('.grandpa').click(function(){
                console.log('爷爷的点击事件被触发了');
            })
        })

    </script>
</head>
<body>
    <div class="grandpa"> 我是爷爷元素
        <div class="parent"> 我是爸爸元素
            <div class="son">我是儿子元素</div>
        </div>
    </div>
</body> 
  • return false除了可以阻止事件冒泡,还可以阻止默认的行为,如,阻止表单的点击submit按钮就会提交表单内容的默认操作

小练习_页面弹框

这里写图片描述

    *样式文件代码省略。。。
   <script src="./js/jquery-1.12.4.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $('#btn01').click(function () {
                //    显示弹框
                $("#pop").show();
                console.log('show');
                // 阻止事件冒泡
                return false;
            })

            $(document).click(function () {
                // 点击文档任何区域都隐藏
                $("#pop").hide();
                console.log('hide');
            })

            $('.pop_con').click(function () {
                // 点击弹出框 阻止传递
                return false;
            })

            $('#shutoff').click(function () {
                // 点击×号 弹框消失
                $("#pop").hide();
            })
        })
    </script>
</head>

<body class="body">
    <input type="button" value="弹出弹框" id="btn01">

    <div class="pop_main" id="pop">

        <div class="pop_con">
            <div class="pop_title">
                <h3>系统提示</h3>
                <a href="#" id="shutoff">×</a>
            </div>
            <div class="pop_detail">
                <p class="pop_text">亲!请关注近期的优惠活动!</p>
            </div>
            <div class="pop_footer">

            </div>
        </div>

        <div class="mask"></div>

    </div>
</body>

事件委托

概念

  • 委托:我把卖房子这件事委托给中介
  • 在js中,委托是指,利用事件冒泡的原理,子级元素将自己的事件委托给父级元素,由父级执行响应的操作
  • Q:为什么要委托给父级,自己可以处理的呀?
    • A:委托的好处有两条:
    • 1.可以减少事件绑定次数,提高性能
    • 2.可以让新加入的子元素也可以拥有相同的操作(直接绑定就不可以,需要重新绑定)

用法

  • 一般的绑定事件
...
$(function(){
    $ali = $('#list li');
    $ali.click(function(){
        $(this).css({color:'red'});
    });
})
...
<ul id ='list'>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
 </ul>
...
  • 事件委托的写法
...
        $(function(){
        // 作用1:值绑定一次点击事件,提高资源利用率 
        //参数1:要委托的子元素 参数2:要委托的事件 参数3:触发事件执行的方法
        $('.ul').delegate('li', 'click', function(){
            // 打印当前点击元素的值
            var val = $(this).val();
            console.log(val);
        })
        // 给ul列表添加一个值为6的li
        // 可以直接被关联点击事件
        // 作用2:新添加的子元素可以直接被绑定事件(一般的事件绑定不可以,需要重新绑定事件)
        $('.ul').append('<li value="6">6</li>');

...
    <ul class="ul">
        <li value="1">1</li>
        <li value="2">2</li>
        <li value="3">3</li>
        <li value="4">4</li>
        <li value="5">5</li>
    </ul>
...

练习_toDoList

这里写图片描述


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>todolist</title>
    <style type="text/css">
        .list_con {
            width: 600px;
            margin: 50px auto 0;
        }

        .inputtxt {
            width: 550px;
            height: 30px;
            border: 1px solid #ccc;
            padding: 0px;
            text-indent: 10px;
        }

        .inputbtn {
            width: 40px;
            height: 32px;
            padding: 0px;
            border: 1px solid #ccc;
        }

        .list {
            margin: 0;
            padding: 0;
            list-style: none;
            margin-top: 20px;
        }

        .list li {
            height: 40px;
            line-height: 40px;
            border-bottom: 1px solid #ccc;
        }

        .list li span {
            float: left;
        }

        .list li a {
            float: right;
            text-decoration: none;
            margin: 0 10px;
        }
    </style>
    <script type="text/javascript" src="./js/jquery-1.12.4.min.js"></script>
    <script type="text/javascript">
        $(function(){
        // 给btn1按钮关联事件
            $('#btn1').click(function(event){
                // 获取用户输入的信息
                var input = $('.inputtxt').val();
                // 判断用户输入是否为空 
                if (input){
                    // 给列表增加一个元素
                    $('.list').append('<li><span>'+input+'</span><a href="javascript:;" class="up"> ↑ </a><a href="javascript:;" class="down"> ↓ </a><a href="javascript:;" class="del">删除</a><a href="javascript:;" class="edit">编辑</a></li>')
                }else{
                    alert('输入不能为空');
                }
                // 清空输入框
                $('.inputtxt').val('');
            })

        // 给每一个a标签关联事件
            $('.list').delegate('a', 'click', function(){
                // 判断点击的是哪种标签
                var className = $(this).prop('class');
                console.log(className);
                // 不同的标签分别处理
                switch(className){
                    // 向下移动
                    case 'down':
                        // 获取点击元素下面的一个元素
                        var $after =  $(this).parent().next();
                        // 判断是否已经移动到最底部
                        if ($after.length!=0){
                            // 将当前元素移动到下一个元素的后面
                            $after.after($(this).parent());
                        }else{
                        // 提示已经移动到了最下方
                        alert('已经移动到了最下方');
                        };
                    break;

                    // 向上移动
                    case 'up':
                        // 获取点击元素的上一条元素
                        var $before = $(this).parent().prev();
                        // 判断是否移到了最上方
                        if ($before.length!=0){
                            // 将当前元素移动到上一个元素的上方
                            $before.before($(this).parent());
                        }else{
                            // 提示已经移动到了最上方
                            alert('已经移动到了最上方');
                        }
                    break;

                    // 删除元素
                    case 'del':
                        // 获取当前元素并且删除
                        $(this).parent().remove();
                    break;

                    // 编辑内容
                    case 'edit':
                        //    

                    break;
                    default:
                    break;
                }
            })

            })

    </script>
</head>

<body>

    <div class="list_con">
        <h2>To do list</h2>
        <input type="text" name="" id="txt1" class="inputtxt">
        <input type="button" name="" value="增加" id="btn1" class="inputbtn">

        <ul id="list" class="list">

            <li>
                <span>学习html</span>
                <a href="javascript:;" class="up"></a>
                <a href="javascript:;" class="down"></a>
                <a href="javascript:;" class="del">删除</a>
                <a href="javascript:;" class="edit">编辑</a>
            </li>
            <li>
                <span>学习css</span>
                <a href="javascript:;" class="up"></a>
                <a href="javascript:;" class="down"></a>
                <a href="javascript:;" class="del">删除</a>
                <a href="javascript:;" class="edit">编辑</a>
            </li>
            <li>
                <span>学习javascript</span>
                <a href="javascript:;" class="up"></a>
                <a href="javascript:;" class="down"></a>
                <a href="javascript:;" class="del">删除</a>
                <a href="javascript:;" class="edit">编辑</a>
            </li>
        </ul>

    </div>
</body>

</html>

元素节点操作

  • 指在js语句中对html文件中的标签在相应节点进行增删操作
  • 有两种使用场景
    • 移动现有标签的位置
    • 将新创建的标签插到现有标签中
  • 创建新标签

var $div = $('<div>');//创建一个空的div
var $div2 = $('<div>这是一个div元素</div>');

  • 移动或者插入标签的方法

    • append()和appendTO():在当前元素的内部,添加元素到最后
    • prepend()和prependTO():在当前元素的内部,添加元素到开首
    • after()和insertAfter(): 在当前元素的后面插入元素
    • before()和insertBefore():在当前元素的前面插入元素
  • 删除元素

    • remove()

在元素内添加移动元素

这里写图片描述
这里写图片描述

    ......
        $(function(){
            // 创建一个空的div对象
            var $div = $('<div>');

            // 创建一个有内容的div对象
            var $div1 = $('<div>4444</div>')

            // 在div_con元素的子元素的最后面添加一个元素
            // $div1.appendTo($('.div_con'));
            $('.div_con').append($div1);

            // 在div_con元素的子元素的最前面添加一个元素
            var $div2 = $('<div>0000</div>');
            // $div2.prependTo($('.div_con'));
            $('.div_con').prepend($div2);

            // 将div_con元素的子元素的最前面的元素移动到最后
            $('.div_con').append($div2);
        })

......

    <div class="div_con">
        <div class="div1">1111</div>
        <div class="div2">2222</div>
        <div class="div3">3333</div>
    </div>

在元素前后添加元素,移动元素,删除元素

这里写图片描述
这里写图片描述

 ......
        $(function(){
            // 在元素div1 的前面添加一个元素
            var $div0 = $('<div>0000</div>');
            // $div0.insertBefore($('.div1'));
            $('.div1').before($div0);

            // 在元素div3 的后面添加一个元素
            var $div4 = $('<div>4444</div>');
            // $div4.insertAfter($('.div3'));
            $('.div3').after($div4);

            // 将第一次添加的元素移动到div的后面
            $('.div2').after($div0);

            // 删除前面三个元素
            $('.div1').remove();
            $('.div2').remove();
            $($div0).remove();

         })
......
    <div class="div1">1111</div>
    <div class="div2">2222</div>
    <div class="div3">3333</div>
......
  • 需要委托的元素必须是接受委托的元素的子元素
  • 可同时委托多个事件,中间用空格隔开

正则表达式

  • 用来匹配字符串中想要的部分的符号串
  • 写法:
    var re = new RegExp('规则',‘可选参数’);
    var re = /规则/参数 ;
  • 规则符号的意义

    正则表达式语法

  • 常用正则规则

//用户名验证:(数字字母或下划线6到20位)
var reUser = /^\w{6,20}$/;

//邮箱验证:        
var reMail = /^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$/i;

//密码验证:
var rePass = /^[\w!@#$%^&*]{6,20}$/;

//手机号码验证:
var rePhone = /^1[34578]\d{9}$/;

表单验证实例

表单验证实例.png

//html文件和CSS文件省略。。。。。。
$(function () {

    // 用一些布尔变量 存放每一个的判断结果
    var error_username = true;
    var error_psw = true;
    var error_rpsw = true;
    var error_email = true;
    var error_allow = false;



    //用户名验证:(数字字母或下划线6到20位)
    var reUser = /^\w{6,20}$/;

    //邮箱验证:        
    var reMail = /^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$/i;

    //密码验证:
    var rePass = /^[\w!@#$%^&*()]{6,20}$/;


    var $user_name = $("#user_name");//用户名
    var $psw = $("#psw");//密码
    var $rpsw = $("#rpsw");//重复密码
    var $email = $("#email");//邮箱
    var $allow = $("#allow");//同意协议

    // 失去焦点的时候做验证
    $user_name.blur(function () {
        // 做验证用户名
        checkUsername();
    }).focus(function () {
        // 获取焦点后把提示的标签隐藏
        $user_name.next().hide();
    })

    function checkUsername() {
        // 获取所有的用户名
        var username = $user_name.val();
        // 获取提示的标签
        var $spantip = $user_name.next();
        // 验证是否为空
        if (username == '') {
            $spantip.html('用户名不能为空').show();
            error_username = true;
            return;
        }

        if (reUser.test(username)) {
            // 验证成功
            error_username = false;
        } else {
            error_username = true;
            $spantip.html('用户名是数字字母或下划线6到20位').show();
        }

    }


    // 失去焦点的时候做验证
    $psw.blur(function () {
        // 做验证密码
        checkPsw();
    }).focus(function () {
        // 获取焦点后把提示的标签隐藏
        $psw.next().hide();
    })

    function checkPsw() {
        // 获取所有的用户名
        var psw = $psw.val();
        // 获取提示的标签
        var $spantip = $psw.next();
        // 验证是否为空
        if (psw == '') {
            error_psw = true;
            $spantip.html('密码不能为空').show();
            return;
        }

        if (rePass.test(psw)) {
            // 验证成功
            error_psw = false;
        } else {
            error_psw = true;
            $spantip.html('密码是数字字母下划线和!@#$%^&*()').show();
        }

    }


    // 失去焦点的时候做验证
    $rpsw.blur(function () {
        // 做验证重复密码
        checkRPsw();
    }).focus(function () {
        // 获取焦点后把提示的标签隐藏
        $rpsw.next().hide();
    })
    // 验证重复密码
    function checkRPsw() {
        // 获取密码
        var psw = $psw.val();

        // 获取重复的密码
        var rpsw = $rpsw.val();
        var $tip = $rpsw.next();
        // 判断是否相同
        if (psw == rpsw) {
            error_rpsw = false;
        } else {
            error_rpsw = true;
            $tip.html('两次密码不一致').show();
        }
    }




    // 失去焦点的时候做验证
    $email.blur(function () {
        // 做验证邮箱
        checkEmail();
    }).focus(function () {
        // 获取焦点后把提示的标签隐藏
        $email.next().hide();
    })

    function checkEmail() {
        // 获取所有的用户名
        var email = $email.val();
        // 获取提示的标签
        var $tip = $email.next();
        // 验证是否为空
        if (email == '') {
            error_email = true;
            $tip.html('邮箱不能为空').show();
            return;
        }

        if (reMail.test(email)) {
            // 验证成功
            error_email = false;
        } else {
            error_email = true;
            $tip.html('邮箱格式不对').show();
        }

    }

    $allow.click(function () {
        // 获取checkbox的选中状态
        var isChecked = $(this).prop('checked');

        // var isChecked = $(this).is(':checked')
        $tip = $(this).nextAll('span');
        if (isChecked) {
            // 如果选中 提示隐藏
            $tip.hide();
            error_allow = false;
        } else {
            error_allow = true;
            $tip.html('必须勾选').show();
        }
    })

    // 表单的提交事件
    $('.form1').submit(function () {
        // 全部验证一遍 
        checkUsername();
        checkPsw();
        checkRPsw();
        checkEmail();

        // and  &&
        if (!error_username && !error_psw && !error_rpsw && !error_email && !error_allow) {
            // 没问题
            alert('提交了呵呵')
        } else {
            return false;
        }

    })


})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值