jquery事件

6 篇文章 0 订阅

事件流

事件流描述的是从页面中接收事件的顺序。

DOM事件流

  1. 事件捕捉阶段
  2. 处于目标阶段
  3. 事件冒泡阶段

事件捕获过程中,document对象首先接收到click事件,然后事件沿着DOM树依次向下,一致传播到事件的实际目标,就是id为btn的a标签。接着所在事件冒泡过程中,事件开始时由最具体的元素(a标签)接收, 然后逐级向上传播到较为不具体的节点(document)。

在jquery中是没有捕获阶段的,在实际项目中用不到捕获阶段。

事件冒泡的处理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
    <style>
        .father{
            width:300px;
            height:300px;
            background-color:red;
        }
    </style>
</head>
<body>
<div class="father">

    <button>按钮</button>
</div>
<script>
    $(function(){
        // 按钮绑定事件,在所有的事件回调函数中,都会有默认的事件对象event
        $('button').click(function(event){
            console.log(event);
            alert($(this).text());

            // 阻止事件冒泡,事件就不会王父亲上传播了
            event.stopPropagation();
        })

        // 给父亲盒子绑定事件
        $('.father').click(function(){
            alert('父亲被点击了');
            
            // 既阻止了默认事件,又阻止了冒泡
            return false;
        })

        /*没有阻止事件冒泡,当点击button按钮的时候,button事件触发,父盒子的事件也触发。这就是事件冒泡,点击button的事件,冒泡到.father,其事件也被执行。*/

    });
</script>
</body>
</html>

事件对象

默认参数event的一些属性解析。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<button>按钮</button>
<input type="text" name="user">
<p class="content"></p>
<script>
    $(function(){
        //$('input').click(function(e){
        //
        //})
        // jquery中没有监听输入框输入内容的方法
        // 使用原生js的 oninput事件
        $('input').get(0).oninput = function(e){
            console.log(e.target.value);
            $('.content').text(e.target.value);
        }

        $('button').click(function(e){
            // currentTarget 当前事件的目标对象
            //console.log(e.currentTarget);
            // 事件的触发对象 返回js对象
            console.log(e.target);

            // 在用事件的时候 95%都需要阻止冒泡
            //e.stopPropagation();

            console.log(e.target.innerText);
            console.log($(e.target).text());

            // 判断 e.currentTarget e.target this之间的关系
            console.log(e.target === this);
            console.log(e.currentTarget === this);
        })
        $('body').click(function(e){
            //console.log(e.currentTarget);
            console.log(e.target);
            console.log(e.target === this);
            console.log(e.currentTarget === this);
        })
        $('html').click(function(e){
            //console.log(e.currentTarget);
            console.log(e.target);
            console.log(e.target === this);
            console.log(e.currentTarget === this);
        })
    })
</script>
</body>
</html>

效果:
在这里插入图片描述

点双击点击事件

click()绑定单击事件,dblclick()绑定双击事件,会有单双击点击事件冲突,即双击的时候单击事件也会触发。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<button>按钮</button>
<script>
    $(function(){
        // 遇到的问题是,在双击时,调用了两次单击。
        // 两次单击中间的时间差是300ms,如果小于300ms表示双击。
        $('button').click(function(e){
            console.log('点击了');
        })
        $('button').dblclick(function(e){
            console.log('双击击了');
        })
    })
</script>
</body>
</html>

效果
在这里插入图片描述
解决双击冲突

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<button>按钮</button>
<script>
    $(function(){

        // 解决单双及冲突问题
        var timer;
        $('button').click(function(e){
            // 如果是双击事件,要阻止两次单击事件的调用
            clearTimeout(timer);  // 取消第一次延迟未执行的定时器
            timer = setTimeout(function(){
                console.log('点击了');
            }, 300);

        })
        $('button').dblclick(function(e){
            clearTimeout(timer);  // 取消的是第二次延迟为执行的定时器
            console.log('双击击了');
        })
        // 双击的时候,给单击设置定时器让其然后执行,在双击的事件驱动中将timer清除,点击事件就不会调用了。
    })
</script>
</body>
</html>

效果:
在这里插入图片描述

鼠标移入移出事件

mouseover, mouseout鼠标指针穿过/离开被选元素或者当前元素的子元素会触发事件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
    <style>
        .father{
            width:200px;
            height:200px;
            background-color:red;
        }
        .child{
            width:50px;
            height:50px;
            background-color:green;
        }
    </style>
</head>
<body>

<div class="father">
    <div class="child"></div>
</div>
<script>
    $(function(){
    	// 鼠标穿过被选元素和被选元素的子元素,会触发此事件
        $('.father').mouseover(function(e){
            console.log('移入');
        })
        $('.father').mouseout(function(e){
            console.log('移出');
        })
    })
</script>
</body>
</html>

在这里插入图片描述
mouseenter, mouseleave鼠标只穿过被选元素会触发事件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
    <style>
        .father{
            width:200px;
            height:200px;
            background-color:red;
        }
        .child{
            width:50px;
            height:50px;
            background-color:green;
        }
    </style>
</head>
<body>

<div class="father">
    <div class="child"></div>
</div>
<script>
    $(function(){
        $('.father').mouseenter(function(e){
            console.log('移入');
        })
        $('.father').mouseleave(function(e){
            console.log('移出');
        })
    })
</script>
</body>
</html>

在这里插入图片描述
jquery的合成事件,合成了mouseenter mouseleave

$('.shortCart').hover(function(){进入事件mouseenter},function(){出去事件mouseleave});

表单事件

1. change() 表单元素发生改变时触发事件,此事件仅限于 input textarea select 元素。
2. select() 文本元素发生改变时触发事件,此事件仅限于input type值为text和textarea的元素
3. submit() 表单元素有默认的submit事件,但是可以调用jQuery的submit通过event.preventDefault来阻止默认事件,动态发送数据。

select

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<input type="text" name="user">
<script>
    $(function(){
        //文本选中的时候会调用
        $('input[type="text"]').select(function(){
            console.log("内容选中了");
        })
    })
</script>
</body>
</html>

效果
在这里插入图片描述
submit

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<form action="//www.baidu.com/s">
    <input type="text" name="wd">
    <input type="submit" value="搜索">
</form>
<script>
    $(function(){
        $('form').submit(function(e){
            // 阻止form的submit默认事件
            e.preventDefault();
            console.log('被提交了');
        })
    })
</script>
</body>
</html>

在这里插入图片描述

鼠标聚焦失焦事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<input type="text" name="user">
<script>
    $(function(){
        // 页面一刷新的时候就获取焦点
        $('input[type="text"]').focus();

        setTimeout(function(){
            // 两秒钟后失去焦点
            $('input[type="text"]').blur();
        }, 2000);

        // 获取焦点的时候绑定事件
        $('input[type="text"]').focus(function(){
            console.log('获取焦点');
        });

        $('input[type="text"]').blur(function(){
            console.log('失去焦点');
        });
    })
</script>
</body>
</html>

键盘按键事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<input type="text" name="user">
<script>
    $(function(){
        $('input[type="text"]').keyup(function(){
            console.log('键盘弹起');
        });

        $('input[type="text"]').keydown(function(){
            console.log('键盘按下');
        });
    })
</script>
</body>
</html>

事件委托

事件委托就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来完成这个事件。
原理:利用冒泡原理,把事件加到父级上,触发执行效果。
作用:

  1. 性能要好
  2. 针对新创建的元素,可以直接拥有事件

使用场景:

  1. 为DOM中很多元素绑定同一事件
  2. 为DOM中不存在的元素绑定事件

没有事件委托的场景,新添加的li标签无事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<ul>
    <li>1</li>
    <li>2</li>
</ul>
<button>添加</button>
<script>
    $(function(){
        // 未来动态的往ul中追加了li标签,就没有事件了,需重新添加事件
        $('ul>li').click(function(){
            alert($(this).text());
        })

        $('button').click(function(){
            $('ul').append('<li>3</li>');
        })
    })
</script>
</body>
</html>

增加事件委托:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.6.0.js"></script>
</head>
<body>
<ul>
    <li>1</li>
    <li>2</li>
</ul>
<button>添加</button>
<script>
    $(function(){
        // 事件委托 on(事件类型,选择器,事件绑定)
        $('ul').on('click', 'li', function(e){
            alert($(this).text());
        })

        $('button').click(function(){
            $('ul').append('<li>3</li>');
        })
    })
</script>
</body>
</html>

效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值