jQuery事件

1. jQuery 事件注册

语法:element.事件(function() {} );

如:$('div').click ( function() { 事件处理程序 })

单个事件注册,一次只能给一个元素注册一个类型的事件,但是有时需要给同个元素注册多个事件,这时就要写重复写,如下代码:

<!-- 引入 jQuery 文件 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<!-- css样式 -->
<style>
    div {
        width: 100px;
        height: 100px;
        background-color: purple;
    }
</style>
<body>
    <!-- HTML结构 -->
    <div></div>
    <!-- js 代码 -->
    <script>
        // (1)点击事件
        $('div').click(function() {
            $(this).css('backgroundColor', 'pink');
        });
        // (2) 鼠标移入事件
        $('div').mouseenter(function() {
            $(this).css('backgroundColor', 'skyblue');
        });
    </script>
</body>

 给div绑定两个事件,需要注册两个事件,代码略显冗余。

2. jQuery 事件处理

2.1 事件处理 on() 绑定事件

on() 方法可以给元素绑定一个或多个事件的事件处理函数。

语法:element.on( events, [ selector ], fn)

①  events:表示一个或多个用空格分隔的事件类型,如“click”’或“mouseenter”。
②  selector:表示元素的子元素选择器,用于事件委托。
③  fn:回调函数,即绑定在元素身上的侦听函数。

2.2 on() 方法是三大优势

(1)优势1 

on() 方法可以绑定多个事件,多个处理事件程序。

<!-- HTML结构 -->
<div></div>
<!-- js 代码 -->
<script>
    // (1) 绑定3个事件:点击事件+鼠标移入和移出事件
    $('div').on({
        click: function() {
            $(this).css('backgroundColor', 'skyblue');
        },
        mouseenter: function() {
            $(this).css('backgroundColor', 'pink');
        },
        mouseleave: function() {
            $(this).css('backgroundColor', 'blue');
        }
    });
    // (2)如果事件程序相同,还可以这样写,注意事件之间使用空格分隔,类似前面学习的hover()
    $('div').on("mouseover mouseout", function() {
        $(this).toggleClass('current')
    })
</script>

注意:

① on() 方法绑定多个事件时,使用对象存储各个事件即事件处理程序;

② 如果事件程序相同,可以简写。

(2)优势2 

可以进行事件委派操作,即把原来加在子元素身上的事件绑定在父元素身上,把事件委派给父元素

<body>
    <!-- HTML结构 -->
    <ul>
        <li>今天我真高兴</li>
        <li>今天我真高兴</li>
        <li>今天我真高兴</li>
        <li>今天我真高兴</li>
        <li>今天我真高兴</li>
    </ul>
    <!-- js 代码 -->
    <script>
        // 需求:点击每个li,该li 的字体颜色变红
        // 使用on()方法,进行事件委派,将事件注册到ul身上,但是触发的对象是li
        $('ul').on('click', 'li', function() {
            $(this).css('color', 'red')
        });
    </script>
</body>

(3)优势3

 on() 方法可以给动态生成的元素绑定事件,但是click()等事件方法不可以。

<body>
    <!-- HTML结构 -->
    <ol></ol>
    <!-- js 代码 -->
    <script>
        // 需求:给动态生成的li 绑定点击事件
        // (1)把点击事件click()放在动态生成元素的前面是无效的
        // $('li').click(function() {
        //     alert(1)
        // });
        // (2)使用on()方法就算放在动态生成元素的前面,也一样可以触发
        $('ol').on('click', 'li', function() {
            alert(11)
        });
        // 创建元素
        let li = $('<li>我是后来创建的</li>');
        // 添加元素
        $('ol').prepend(li);
    </script>
</body>

分析:之所以使用on()方法可以为动态生成的元素绑定事件,是因为它利用的是事件委派,真正绑定事件的是它的父元素,而它只是触发对象。

2.3 案例:仿微博留言发布

需求:在文本框内书写内容,点击发布,最新发布的内容显示在文本框下面,并且每条内容自带一个删除链接,点击该链接可以删除本条内容。

<!-- 引入 jQuery 文件 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<!-- css样式 -->
<style>
    * {
        margin: 0;
        padding: 0;
    }
    .container {
        width: 500px;
        padding: 20px 10px 20px 20px;
        margin: 100px auto;
        border: 1px solid #ccc;
    }
    textarea {
        width: 380px;
        height: 200px;
        resize: none;
        outline: none;
    }
    ul {
        margin: 15px 50px 0 70px;
    }
    ul li {
        display: none;
        line-height: 30px;
        list-style: none;
        font-size: 14px;
        border-bottom: 1px dashed #ccc;
    }
    ul li a {
        float: right;
        text-decoration: none;
    }
</style>
<body>
    <!-- HTML结构 -->
    <div class="container">
        <div class="send">
            <span>微博发布</span>
            <textarea id="text"></textarea>
            <button id="sendBtn">发布</button>
        </div>
        <ul></ul>
    </div>
    <!-- js 代码 -->
    <script>
        $(function() {
            // (1) 点击发布按钮,动态创建一个小li,放入文本框的内容和删除按钮,并且添加到ul中
            $('#sendBtn').on('click', function() {
                // 获取文本框中的值
                let value = $("#text").val();
                // 非空验证
                if (value.trim().length === 0) {
                    return alert('请输入内容');
                };
                // 创建元素li
                let li = $('<li></li>');
                // 给元素li赋值
                li.html(value + '<a href="javascript:;">删除</a>');
                // 添加元素
                $('ul').prepend(li);
                // 让li慢慢滑动出来
                li.slideDown();
                // 清空文本框内容
                $("#text").val('');
            });
            // (2) 点击删除按钮,可以删除当前的留言li
            // 删除按钮是动态创建的,所以使用on()方法绑定事件
            $('ul').on('click', 'a', function() {
             // slideUp()是将元素上拉隐藏,并未真的删除,所以利用它的回调函数参数进行真正的删除
                $(this).parent().slideUp(function() {
                    $(this).remove();
                })
            });
        })
    </script>
</body>

2.4 事件处理 off() 解绑事件

off() 方法可以移除事件处理程序(即解绑事件)。

语法:

① $('div').off()   // 解绑div元素所有的事件处理程序

② $('div').off('click')   // 解绑div元素上面的点击事件

③ $('ul').off('click' , 'li' )   // 解绑ul元素的事件委托

2.5 代码体验

<!-- 引入 jQuery 文件 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<!-- css样式 -->
<style>
    div {
        width: 200px;
        height: 200px;
        background-color: pink;
    }
</style>
<body>
    <!-- HTML结构 -->
    <div></div>
    <ul>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
    </ul>
    <p>我是个啥</p>
    <!-- js 代码 -->
    <script>
        $(function() {
            // 绑定事件
            $("div").on({
                click: function() {
                    console.log("我点击了");
                },
                mouseover: function() {
                    console.log("我经过了");
                }
            });
            $("ul").on("click", "li", function() {
                alert(111);
            });
            // 1. 事件解绑 off  无参全部解绑,有参就是解绑参数对应的事件
            // $("div").off(); // 全部解绑
            $("div").off("click"); // 解除点击事件
            // 解绑事件委托
            $("ul").off("click", "li");
            // $("ul").off();

            // 2. one() 但是它只能触发事件一次
            $("p").one("click", function() {
                alert(222);
            })
        })
    </script>
</body>

注意:如果某个事件从头到尾只需要执行一次,那么没必要注册事件然后又解绑事件,可以直接使用one() 方法,该方法绑定的事件只能触发一次

2.6 自动触发事件 trigger()

有些事件希望自动触发,比如轮播图自动播放功能跟点击右侧按钮一致,可以利用定时器自动触发右侧按钮点击事件,不必鼠标点击。

语法:

① element.事件();     // 如:element.click()

② element.trigger('事件类型');    // 如:element.trigger('click')

③  element.triggerHandler('事件类型')    // 如: element.triggerHandler('click')

2.7 代码体验

<!-- 引入 jQuery 文件 -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<!-- css样式 -->
<style>
    div {
        width: 200px;
        height: 200px;
        background-color: pink;
    }
</style>
<body>
    <!-- HTML结构 -->
    <div></div>
    <input type="text" name="" id="">
    <!-- js 代码 -->
    <script>
        $(function() {
            // (1)给div绑定事件
            $("div").on("click", function() {
                alert(111);
            });
            // (2)自动触发事件的三种方法
            // 1. 元素.事件()
            // $("div").click();
            // 2. 元素.trigger("事件")
            // $("div").trigger("click");
            // 3. 元素.triggerHandler("事件")  不会触发元素的默认行为
            $("div").triggerHandler("click");
            $("input").on("focus", function() {
                    $(this).val("你好吗?")
                });
            // $("input").triggerHandler("focus");  // 不会有鼠标光标闪动
            // $("input").trigger("focus"); // 会有鼠标光标闪动(触发默认行为)
            $("input").focus(); // 会有鼠标光标闪动(触发默认行为)
        })
    </script>
</body>

注意:第二种方法:元素.trigger("事件") 和 第三种方法:元素.triggerHandler("事件")区别在于是否会触发元素的默认行为,第二种会触发,而第三种不会触发,同时第一种:元素.事件() 也会触发默认行为。

3. jQuery 事件对象

只要事件被触发,就会有事件对象的产生。

jQuery事件对象中的相关内容和原生js中的事件对象类似,比如也有阻止默认行为:e.preventDefault()、阻止冒泡:e.stopPropagation() 等。所以在此不再赘述,有需要的可以查看我的这篇文章DOM--事件操作_JJ_Smilewang的博客-CSDN博客_dom事件操作

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值