美文网首页
20、jQuery 事件机制

20、jQuery 事件机制

作者: 一直流浪 | 来源:发表于2022-08-31 23:31 被阅读0次

20、jQuery 事件机制

原生js事件与jQuery事件:

(1)用原生的js给div注册事件

  • 原生js注册相同的事件,后面的会把前面的覆盖
document.getElementById("one").onclick=function(){
    alert("单击事件1");
};

document.getElementById("one").onclick=function(){
    alert("单击事件2");
}

(2)jQuery注册相同的事件,不会吧前面的覆盖

$('#one').click(function(){
    alert("单击事件1");
});
$('#one').click(function(){
    alert("单击事件2");
});

jQuery事件的发展历程:

(1)简单的事件绑定 click()

  • 不支持同时注册,也不支持动态注册(新创建的组件不能自动注册应有的事件)
//不支持同时注册
$('div').click(function(){
    console.log("鼠标单击事件");
});

$('div').mouseenter(function(){
    console.log("鼠标移入事件");
});

//新创建的节点对click()事件不支持动态注册
$('#btn').click(function(){
            var $divNew = $('<div class="two"></div>');
            $('body').append($divNew);
});

(2)bind方式注册事件

  • 支持同时注册,也不支持动态注册(新创建的组件不能自动注册应有的事件)
//支持同时注册
$('div').bind({
    mouseenter:function(){
        console.log("鼠标移入事件");
    },
click:function(){
        console.log("鼠标单击事件");
    }
});

//新创建的节点对bind()事件不支持动态注册
$('#btn').click(function(){
            var $divNew = $('<div class="two"></div>');
            $('body').append($divNew);
});

(3) delegate注册委托事件

  • 支持同时注册,也支持动态注册(新创建的组件可以自动注册应有的事件)
  • 需要把事件注册在父亲节点上面
  • 原理是事件冒泡
$('body').delegate('div',{
    mouseenter:function(){
        console.log("鼠标移入事件");
    },
    click:function(){
        console.log("鼠标单击事件");
    }
});

(4)jQuery1.7之后,jQuery用on统一了所有事件的注册

on 注册事件:

  • jQuery1.7之后,jQuery用on统一了所有事件的注册
  • 最现代的方式,兼容zepto(移动端类似jQuery的一个库),强烈建议使用。

(1)on简单注册事件

  • 不支持动态创建
$('div').on('click',function(){
    console.log("我是点击事件");
});

(2)on委托注册

  • 需要把事件注册到父亲节点
$('body').on('click','div,span',function(){
    console.log("我是点击事件");
});

案例:动态数据的添加和删除

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>表格删除</title>
        <style>
            *{
                padding: 0;
                margin: 0;
            }
            table{
                border-collapse:collapse ;
                border-spacing: 0;
                
            }
            
            thead{
                display: table-header-group;
                vertical-align: middle;
                border-color:inherit ;
            }
            
            tbody{
                display: table-row-group;
                vertical-align: middle;
                border-color: inherit;
            }
            th{
                padding: 10px 10px;
                background-color: skyblue;
                border: 1px solid white;
            }
            td{
                padding: 10px 10px;
                background-color: #eeeeee;
                border: 1px solid #999999;
            }
            .mask{
                position: absolute;
                left: 0px;
                top:0px;
                background-color: #EEEEEE;
                opacity:0.5;
                width: 100000px;
                height: 10000px;
                display: none;
            }
            
            .form-add{
                width: 400px;
                height: 300px;
                background: skyblue;
                position:absolute;
                left:0;
                top: 0;
                bottom: 0;
                right: 0;
                display: none;
            }
            
            #j_hideFormAdd{
                position:absolute;
                top: 0px;
                right: 0px;
                font-size: 50px;
            }           
        </style>
    </head>
    <body>
        <div class="wrap">
            <input type="button" value="添加数据" id="btn" />
            <table>
                <thead>
                    <tr>
                        <th>专栏名称</th>
                        <th>内容描述</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody id="tb">
                    <tr>
                        <td>JavaSE 学习笔记</td>
                        <td>参考Oracle官方文档,系统学习JavaSE</td>
                        <td><button class="del">删除</button></td>
                    </tr>
                    <tr>
                        <td>Oracle数据库笔记</td>
                        <td>参考Oracle官方文档,系统学习Oracle数据库</td>
                        <td><button class="del">删除</button></td>
                    </tr>
                    <tr>
                        <td>LeetCode热门算法100道</td>
                        <td>刷题的必选之路</td>
                        <td><button class="del">删除</button></td>
                    </tr>
                    <tr>
                        <td>Linux学习笔记</td>
                        <td>从零学习Linux系统</td>
                        <td><button class="del">删除</button></td>
                    </tr>
                </tbody>
            </table>
        </div>
        
        <div id="j_mask" class="mask"></div>
        
        <div id="j_formAdd" class="form-add">
            <div class="form-add-title">
                <span>添加数据</span>
                <div id = "j_hideFormAdd">×</div>
            </div>
            <div class="form-item">
                <label class="lb" for="j_txtLesson">专栏名称:</label>
                <input class="txt" type="text" id="column" placeholder="请输入专栏名称" />
            </div>
            <div class="form-item">
                <label class="lb" for="j_txtBelSch">内容简述:</label>
                <input class="txt" type="text" id="content" placeholder="请输入内容描述" />
            </div>
            <div class="form-submit">
                <input type="button" id="j_btnAdd" value="添加" />
            </div>
        </div>
        
        
    </body>
</html>

<script type="text/javascript" src="js/jQuery.js" ></script>
<script>
    $(function(){       
        //1.删除一行
        //使用on委托注册事件
        $('#tb').on('click','.del',function(){
            //jQuery为了使用方便,把this修改了,为点击元素,不是父亲节点tbody
            $(this).parent().parent().remove();
        })
            
            
        
        //2.设置添加数据按钮事件
        $('#btn').click(function(){
            $('#j_formAdd').show();
            $('#j_mask').show();
        });
        
        //3.设置关闭按钮事件
        $('#j_hideFormAdd').click(function(){
            $('#j_formAdd').hide();
            $('#j_mask').hide();
        });
        
        //4.设置添加按钮事件
        $('#j_btnAdd').click(function(){
            //获取专栏名称和内容描述
            var $column = $('#column').val();
            var $content = $('#content').val();
            
            //把用户的输入专栏名称和内容描述,创建一个tr
            var $trNew = $('<tr>'+
            '<td>'+$column+'</td>'+
            '<td>'+$content+'</td>'+
            '<td><button class="del">删除</button></td></tr>');
            
            //把新创建的tr标签添加到tbody中
            $('#tb').append($trNew);
            
            //把添加数据面板和遮罩隐藏
            $('#j_hideFormAdd').click();    
        });
    })
</script>

事件解绑:

(1)unbind方式解绑事件(不推荐使用)

//解绑所有事件
$('div').unbind();
//解绑指定事件
$('div').unbind('click');

(2)undelegate方式解绑事件(不推荐使用)

//解绑所有事件
$('div').undelegate();
//解绑指定事件
$('div').undelegate('click');

(3)off方式解绑事件(推荐使用)

//解绑所有事件
$('div').off();
//解绑指定事件
$('div').off('click');

案例:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            #one{
                width: 200px;
                height: 200px;
                border: 2px solid red;
            }
        </style>
    </head>
    <body>
        <input type="button" value="注册事件" id="btn1" />
        <input type="button" value="解绑事件" id="btn2" />
        <br />
        <div class="one" id="one"></div>
    </body>
</html>

<script type="text/javascript" src="js/jQuery.js" ></script>
<script>
    $(function(){
        //jQuery用on注册事件,用off来解绑
        //off()不给参数就是解绑所有的事件
        //off(参数)解绑指定事件
        
        //添加注册事件
        $('#btn1').click(function(){
            //给div注册事件
            $('#one').on({
                'click':function(){
                    console.log("这个单击事件");
                }
            });
            $('#one').on({
                'mouseenter':function(){
                    console.log("这个鼠标移入事件");
                }
            });
        });
        
        //添加解绑事件
        $('#btn2').click(function(){
            //给div解绑事件(无参数,解绑所有参数)
//          $('#one').off();
            
            //解绑指定事件(有参数,解绑指定事件)
            $('#one').off('click');
        })
        
        //添加解绑事件(不是用on注册的也可以用off解绑)
        $('#btn2').click(function(){
            $('#btn1').off('click');
        })
    })
</script>

事件触发:

方法:trigger()

(1)代码的方式触发事件

        var i = 0;
        $('#btn').on('click',function(){
            i++;
            if(i>=3){
                //条件满足,触发事件
//              $('#one').click();
                $('#one').trigger('click');
            }
        });

(2)可以触发自定义事件

        //给div注册一个自定义事件(没有触发事件)
        $('#one').on('kill',function(){
            console.log('我是kill事件');
        });
        
        //使用触发器触发
        $('#btn2').on('click',function(){
            var res = confirm('是否启动kill事件');
            if(res){
                //触发自定义kill事件
                $('#one').trigger('kill');
            }
        });

jQuery事件对象:

  1. 什么是事件对象?

    • 注册一个事件,系统会帮我们生成一个对象记录这个事件触发时候的一些信息
    • 比如事件是按那个键触发的,触发的位置坐标。。。
    • jQuery在事件中由参数e来获取
    • jQuery的事件对象是对元素js的事件进行了封装,处理了兼容性
  2. 三个常用坐标

    • screenX,screenY触发事件的点距离屏幕左上角的坐标
  • clientX,clientY触发事件的点距离可视区左上角的坐标(忽视滚动条)

    • pageX,pageY触发事件的点距离页面左上角的坐标
//screenX,screenY触发事件的点距离屏幕左上角的坐标
console.log('ScreenX'+':'+e.screenX+'---'+'ScreenY'+':'+e.screenY);

//clientX,clientY触发事件的点距离可视区左上角的坐标(忽视滚动条)
console.log('ClientX'+':'+e.clientX+'---'+'ClientY'+':'+e.clientY);

//pageX,pageY触发事件的点距离页面左上角的坐标
console.log('pageX'+':'+e.pageX+'---'+'pageY'+':'+e.pageY);
  1. stopPropagation() : 阻止事件冒泡

    $('#btn').on('click',function(e){
     alert('我是按钮的点击事件');
     e.stopPropagation();
    });
    
  2. preventDefault() : 阻止默认行为,阻止a标签跳转

    $('a').on('click',function(e){
        alert('我是a标签的单击事件');
        //stopPropagation():阻止事件冒泡
        e.stopPropagation();
    
        //4.preventDefault():阻止默认行为,阻止a标签跳转
        e.preventDefault();
    });
    
  3. return false 既能阻止事件冒泡,又能阻止a标签跳转

    $('a').on('click',function(e){
     alert('我是a标签的单击事件');
    
     //5.return false 既能阻止事件冒泡,又能阻止a标签跳转
     return false;
    });
    
  4. keydown 获取键盘按键

    $(document).on('keydown',function(e){}
    

案例:按键变色

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            #bgChage{
                height: 50px;
                font-size: 40px;
            }
        </style>
    </head>
    <body>
        <div class="wrop">
            <h1>按键变色</h1>
            <div id="bgChage" style="background-color: blue">
                keyCode为:
                <span id="keyCodeSpan"></span>
            </div>
        </div>
    </body>
</html>

<script type="text/javascript" src="js/jQuery.js" ></script>
<script>
    $(function(){
        //获取div
        var $div = $('#bgChage');
        
        //显示按键的span
        var $showCode = $('#keyCodeSpan');
        
        //给页面注册一个键盘按键事件
        $(document).on('keydown',function(e){
            console.log(e.keyCode); // r:82   g:71   b:66    y:89  
            switch(e.keyCode){
                case 82:
                    $div.css('background-color','red');
                    $showCode.text('82');
                break;
                case 71:
                    $div.css('background-color','green');
                    $showCode.text('71');
                break;
                case 66:
                    $div.css('background-color','blue');
                    $showCode.text('66');
                break;
                case 89:
                    $div.css('background-color','yellow');
                    $showCode.text('89');
                break;  
                default:
                    $div.css('background-color','pink');
                    $showCode.text('没有这个键');
            }
        })
    })
</script>

案例:五角星评分

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>五角星评分案例</title>
        <style>
            ul{
                list-style: none;
            }
            li{
                display: inline-block;
            }
            .comment{
                font-size:40px ;
                color: red;
            }
        </style>
    </head>
    <body>
        <ul class="comment">
            <li>☆</li>
            <li>☆</li>
            <li>☆</li>
            <li>☆</li>
            <li>☆</li>
        </ul>
    </body>
</html>

<script type="text/javascript" src="js/jQuery.js" ></script>
<script>
    $(function(){
        //需求1:鼠标移入五角星,会把当前li标签和前面的li标签显示为实心五角星,后面的显示空心五角星
        //需求2:鼠标离开li,会把所有的li标签设为空心五角星
        //需求3:点击li,鼠标离开后,刚才被点击的li标签及前面的li标签为实心,后面为空心
        
        //prev():上一个兄弟
        //prevAll():前面所有兄弟
        //next():下一个兄弟
        //nextAll():后面所有兄弟
        
        
        //需求1:
        $('.comment>li').on('mouseenter',function(){
//          console.log('鼠标进入');
            //需求1
            $(this).text('★').prevAll().text('★');
            $(this).nextAll().text('☆');
            
        }).on('mouseleave',function(){
//          console.log('鼠标离开');
            //需求2
            $('.comment>li').text('☆');
            
            //获取刚才点击的li(属性选择器)
            $('.comment>li[flag]').text('★').prevAll().text('★');
            
            $('.comment>li[flag]').nextAll().text('☆');

        }).on('click',function(){
//          console.log('鼠标单击');
            //需求3:给当前的li添加记号
            //给当前鼠标点击的li添加独一无二的属性
            $(this).attr('flag','flag').siblings().removeAttr('flag');
        })  
    })
</script>

相关文章

  • 20、jQuery 事件机制

    20、jQuery 事件机制 原生js事件与jQuery事件: (1)用原生的js给div注册事件 原生js注册相...

  • jQuery事件

    1.事件机制jQuery的事件机制,指的是:jQuery对JavaScript操作DOM事件的封装,包括了:事件绑...

  • jQuery事件机制

    jQuery的事件机制,指的是:jQuery对JavaScript操作DOM事件的封装,包括了:事件绑定、事件解绑...

  • jQuery 事件机制

    jQuery 事件机制 1、on方式 语法 2、事件解绑 unbind ( ) 方式 和 undelegate (...

  • jQuery五 - 快速开发

    3.1 jQuery事件注册 jQuery 为我们提供了方便的事件注册机制,具体的操作优缺点如下: 优点: 操作简...

  • jQuery的基本使用三

    1 jQuery 事件注册 ​ jQuery 为我们提供了方便的事件注册机制,是开发人员抑郁操作优缺点如下: ...

  • jQuery 事件注册

    1.1. jQuery 事件注册 ​ jQuery 为我们提供了方便的事件注册机制,是开发人员抑郁操作优缺点如...

  • 3.jQuery 事件注册、jQuery 事件处理、 jQuer

    1.1. jQuery 事件注册 ​ jQuery 为我们提供了方便的事件注册机制,是开发人员抑郁操作优缺点如...

  • jQuery 学习笔记(三)

    1.jQuery 事件注册 jQuery 为我们提供了方便的事件注册机制,使开发人员易于操作,优缺点如下: 优点:...

  • 20:jQuery事件

    jquery 如何绑定事件?直接绑定和使用事件代理分别如何使用 //ps:两种方式内存消耗相差很多。明显第二种使用...

网友评论

      本文标题:20、jQuery 事件机制

      本文链接:https://www.haomeiwen.com/subject/atbqwrtx.html