ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

事件高级2

2021-07-24 17:33:11  阅读:130  来源: 互联网

标签:console 鼠标 高级 事件 document event log


目录

事件委托(代理、委派)

应用场景

事件委托的原理

事件委托的作用

常用的鼠标事件

禁止鼠标右键菜单

禁止鼠标选中

鼠标事件对象

案例:跟随鼠标的天使

常用的键盘事件

常用的键盘事件

键盘事件对象

模拟京东按键输入内容

京东快递单号查询


事件委托(代理、委派)

  • 事件冒泡本身的特性,会带来坏处,也会带来好处,需要灵活使用
  • 事件委托也称为事件代理,在 jQuery 里面称为事件委派

应用场景

生活中有如下场景:

  • 100 个学生,100 个快递员,100份快递,领取各自的快递
  • 解决方案:快递员将100份快递委托给班主任,班主任将快递放到办公室,学生下课自行领取

实际开发中的场景:

  • ul 下有多个 li,要求点击每一个 li 都会执行相应的处理程序
  • 以前需要给每一个 li 注册事件,访问 DOM 的次数大大增加,延长了整个页面的交互就绪时间,效率极低

事件委托的原理

不是每个子结点单独设置事件监听器,而是将事件监听器设置在其父节点上,然后利用冒泡原理影响设置每一个子节点

以上的案例中:

  • 我们直接给 ul 注册点击事件,然后利用事件对象的 target 来找到当前点击的 li 
  • 因为点击 li,事件就会冒泡到 ul 上,ul 有了注册事件,就会触发事件监听器

事件委托的作用

  • 只操作了一次 DOM,提高了程序的性能
<body>
    <ul>
        <li>路人甲</li>
        <li>炮灰乙</li>
        <li>流氓丙</li>
        <li>土匪丁</li>
        <li>小二戊</li>
    </ul>
    <script>
        // 事件委托的核心原理
        // 给父节点添加监听器,利用冒泡原理影响设置每个子节点
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(event) {
            // alert('你瞅啥!!!');
            // e.target 可以得到我们点击的对象
            for (var i = 0; i < ul.children.length; i++) {
                ul.children[i].style.backgroundColor = '';
            }
            event.target.style.backgroundColor = 'lightblue';
        }, false);
    </script>
</body>

常用的鼠标事件

鼠标事件触发条件
onclick鼠标点击触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发
contextmenu禁止鼠标右键菜单
selectstart禁止选中文字

禁止鼠标右键菜单

  • contextmenu
  • 主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单
<body>
    该文本禁止右键菜单
    <script>
        // 显示右键菜单:contextmenu,我们可以禁用它
        document.addEventListener('contextmenu', function(event) {
            event.preventDefault();
        });
    </script>
</body>

禁止鼠标选中

  • selectstart
  • 开始选中
<body>
    该文本禁止选中文字
    <script>
        // 选中文字:selectstart,我们可以禁用它
        document.addEventListener('selectstart', function(event) {
            event.preventDefault();
        });
    </script>
</body>

鼠标事件对象

  • event 对象代表事件的状态,与事件相关的一系列信息的集合
  • 现阶段主要使用鼠标事件对象 MouseEvent 和键盘事件对象 KeyboardEvent
鼠标事件对象说明
e.clientX返回鼠标相对于浏览器窗口可视区的 X 坐标
e.clientY返回鼠标相对于浏览器窗口可视区的 Y 坐标
e.pageX返回鼠标相对于文档页面的 X 坐标;IE9+ 支持
e.pageY返回鼠标相对于文档页面的 Y 坐标;IE9+ 支持
e.screenX返回鼠标相对于电脑屏幕的 X 坐标
e.screenY返回鼠标相对于电脑屏幕的 Y 坐标
    <script>
        // 鼠标事件对象 MouseEvent
        document.addEventListener('click', function(event) {           
            console.log(event);
            console.log('----------------------');
            // 1.client:返回鼠标相对于浏览器窗口可视区的 X 和 Y 坐标
            console.log(event.clientX);
            console.log(event.clientY);
            console.log('----------------------');
            // 2.page:返回鼠标相对于页面文档的 X 和 Y 坐标
            // 开发中经常使用,重点;兼容性问题:IE9+
            console.log(event.pageX);
            console.log(event.pageY);
            console.log('----------------------');
            // 3.screen:返回鼠标相对于电脑屏幕的 X 和 Y 坐标
            console.log(event.screenX);
            console.log(event.screenY);
        });
    </script>

案例:跟随鼠标的天使

案例分析:

  • 鼠标不断移动,使用鼠标移动事件:mousemove
  • 在页面中移动,给 document 注册事件
  • 图片要移动距离,而且不占位置,使用绝对定位
  • 核心原理:每次鼠标移动,都会获得最新的鼠标坐标,把这个 x 和 y 坐标作为图片的 top 和 left 值就可以移动图片
    <style>
        img {
            position: absolute;
            transform: translate(-50%, -50%);
            /* 去掉鼠标箭头,只剩天使 */
            cursor: none;
        }
    </style>
<body>
    <img src="images/angel.gif" alt="">
    <script>
        var picture = document.querySelector('img');
        // mousemove 只要鼠标在页面中移动 1px,就会触发此事件
        document.addEventListener('mousemove', function(event) {
            var x = event.pageX;
            var y = event.pageY;
            // 需要给 left 和 top 添加单位 px 
            picture.style.left = x + 'px';
            picture.style.top = y + 'px';
        });
    </script>
</body>

常用的键盘事件

常用的键盘事件

  • 事件除了使用鼠标触发,还可以使用键盘触发
键盘事件触发条件
onkeyup某个按键被松开时触发
onkeydown某个按键被按下时触发
onkeypress某个按键被按下时触发

注意:

  • 如果使用 addEventListener 不需要加 on
  • onkeypress 与另外两个键盘事件的区别不能识别功能键,如:ctrl、shift、箭头等
  • 按下并弹起某个按键的过程中,三个事件的执行顺序:onkeydown -- onkeypress -- onkeyup
    <script>
        // 常用的键盘事件
        // 1.onkeyup 按键弹起时触发
        // 传统注册方式
        // document.onkeyup = function(event) {
        //     console.log(event.key + ' 被弹起');
        // }

        // addEventListener()
        document.addEventListener('keyup', function(event) {
            console.log(event.key + ' 被弹起了');
        });

        // 2.onkeydown 按键按下时触发
        document.addEventListener('keydown', function(event) {
            console.log(event.key + ' 被按下了down');
        });

        // 3.onkeypress 按键按下时触发,不能识别功能键,比如:ctrl、shift、箭头等
        document.addEventListener('keypress', function(event) {
            console.log(event.key + ' 被按下了press');
        });
    </script>

键盘事件对象

键盘事件对象的属性说明
keyCode返回该键的 ASCII 码值

注意:

  • onkeydown 和 onkeyup:不区分字母大小写
  • onkeypress:区分字母大小写
  • 在实际开发中,我们更多的使用 keydown 和 keyup,能识别所有按键(包括功能键)
  • keypress 不识别功能键,但是该事件的 keyCode 属性能区分字母大小写,返回不同的 ASCII 码值
    <script>
        // 键盘事件对象
        // keyCode 属性可以得到相应按键的 ASCII 码值
        // 1.keyup 和 keydown 事件不区分字母大小写。a 和 A 输出的都是 65
        document.addEventListener('keyup', function(event) {
            console.log(event.keyCode);
        });
        document.addEventListener('keydown', function(event) {
            console.log(event.keyCode);
        })

        // 2.keypress 事件区分字母大小写。a 输出的是 97,A 输出的是 65
        document.addEventListener('keypress', function(event) {
            console.log(event.keyCode);
        });
    </script>
    <script>
        // 键盘事件对象
        // 利用 keyCode 判断哪个键被按下
        document.addEventListener('keypress', function(event) {
            if (event.keyCode === 97) {
                console.log('被按下了的键是a!');
            } else {
                console.log('被按下了的键不是a!');
            }
        })
    </script>

模拟京东按键输入内容

案例分析

  • 核心思路:检测用户是否按下 s 键,如果按下 s 键,将光标定位到搜索框中
  • 使用键盘事件对象中的 keyCode 属性判断用户按下的是否是 s 键
  • 搜索框获得焦点:使用 JS 里面的 focus() 方法
<body>
    <input type="text">
    <script>
        var search = document.querySelector('input');
        // 使用 keydown 会在按下 s 键时将 s 输入搜索框
        // keyup 不会
        document.addEventListener('keyup', function(event) {
            if (event.keyCode === 83) {
                search.focus();
            }
        });
    </script>
</body>

京东快递单号查询

要求:当我们在文本框中输入内容时,文本框上面自动显示大字号的内容

案例分析

  • 快递单号输入内容时,上面的大号字体盒子(con)显示(字号更大)
  • 表单检测用户输入:给表单键入键盘事件
  • 同时将快递单号里面的值(value)获取过来赋给 con 盒子(innerHTML)
  • 如果快递单号里面的内容为空,则隐藏大号字体盒子(con)
  • 失去焦点,隐藏 con 盒子
  • 获得焦点,并且文本框内容不为空,显示 con 盒子

注意:

  • keydown 和 keypress 事件触发时,文字还没有写入文本框中
  • keyup 事件触发时,文字已经写入文本框中
<body>
    <div class="search">
        <div class="con">123</div>
        <input type="text" placeholder="请输入您的快递单号" class="jd">
    </div>
    <script>
        // 模拟京东快递单号查询案例
        var con = document.querySelector('.con');
        var jd_input = document.querySelector('.jd');
        jd_input.addEventListener('keyup', function() {
            // 如果快递单号里面的内容为空,则隐藏大号字体盒子(con)
            if (this.value == '') {
                con.style.display = 'none';
            } else {
                con.style.display = 'block';
                // 将快递单号里面的值(value)获取过来赋给 con 盒子(innerHTML)
                con.innerHTML = this.value
            };
        });
        // 失去焦点,con 隐藏
        jd_input.addEventListener('blur', function() {
            con.style.display = 'none';
        });
        // 获得焦点,且输入框内容不为空,con 显示
        jd_input.addEventListener('focus', function() {
            if (this.value !== '') {
                con.style.display = 'block';
            }
        });
    </script>
</body>

标签:console,鼠标,高级,事件,document,event,log
来源: https://blog.csdn.net/weixin_41909678/article/details/119044555

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有