zoukankan      html  css  js  c++  java
  • 0170 事件对象:事件对象的属性和方法,e.target 和 this 的区别

    1.3.5.1 什么是事件对象

    事件对象:事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象。

    比如:

    1. 谁绑定了这个事件。

    2. 鼠标触发事件的话,会得到鼠标的相关信息,如鼠标位置。

    3. 键盘触发事件的话,会得到键盘的相关信息,如按了哪个键。


    1.3.5.2 事件对象的使用

    事件触发发生时,就会产生事件对象,并且系统会以实参的形式传给事件处理函数。

    所以,在事件处理函数中声明1个形参用来接收事件对象。


    1.3.5.3 事件对象的兼容性处理

    事件对象本身的获取存在兼容问题:

    1. 标准浏览器中是浏览器给方法传递的参数,只需要定义形参 e 就可以获取到。
    2. 在 IE6~8 中,浏览器不会给方法传递参数,如果需要的话,需要到 window.event 中获取查找。
    解决:
    e = e || window.event;
    

    只要“||”前面为false, 不管“||”后面是true 还是 false,都返回 “||” 后面的值。
    只要“||”前面为true, 不管“||”后面是true 还是 false,都返回 “||” 前面的值。
    
        <div>123</div>
        <script>
            var div = document.querySelector('div');
            div.onclick = function(e) {
                    // 事件对象
                    e = e || window.event;
                    console.log(e);
            }
        </script>
    

    1.3.5.4 事件对象的属性和方法


    1.3.5.5 e.target 和 this 的区别

    • this 是事件绑定的元素(绑定这个事件处理函数的元素) 。

    • e.target 是事件触发的元素。

    常情况下terget 和 this是一致的,
    但有一种情况不同,那就是在事件冒泡时(父子元素有相同事件,单击子元素,父元素的事件处理函数也会被触发执行),
    这时候this指向的是父元素,因为它是绑定事件的元素对象,
    而target指向的是子元素,因为他是**触发事件的那个具体元素对象**。
    
        <div>123</div>
        <script>
            var div = document.querySelector('div');
            div.addEventListener('click', function(e) {
                // e.target 和 this指向的都是div
                console.log(e.target);
                console.log(this);
            });
        </script>
    

    事件冒泡下的e.target 和 this

        <ul>
            <li>abc</li>
            <li>abc</li>
            <li>abc</li>
        </ul>
        <script>
            var ul = document.querySelector('ul');
            ul.addEventListener('click', function(e) {
                  // 我们给ul 绑定了事件  那么this 就指向ul  
                  console.log(this); // ul
    
                  // e.target 触发了事件的对象 我们点击的是li e.target 指向的就是li
                  console.log(e.target); // li
            });
        </script>
    
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            div {
                 100px;
                height: 100px;
                background-color: orange;
            }
            
            ul {
                background-color: pink;
                list-style: none;
            }
            
            li {
                height: 30px;
                margin: 10px 0;
                border: 1px solid #000;
                background-color: lightcyan;
            }
        </style>
    </head>
    
    <body>
        <div>123</div>
        <ul>
            <li>abc111</li>
            <li>abc222</li>
            <li>abc333</li>
        </ul>
        <script>
            // 常见事件对象的属性和方法
            // 1. e.target 返回的是触发事件的对象(元素)  this 返回的是绑定事件的对象(元素)
            // 区别 : e.target 点击了那个元素,就返回那个元素 this 那个元素绑定了这个点击事件,那么就返回谁
            var div = document.querySelector('div');
            div.addEventListener('click', function(e) {
                console.log(e.target);
                console.log(this);
            })
    
            var ul = document.querySelector('ul');
            ul.addEventListener('click', function(e) {
                // 我们给ul 绑定了事件  那么this 就指向ul  
                console.log(this);
                // console.log(e.currentTarget);
    
                // e.target 指向我们点击的那个对象 谁触发了这个事件 我们点击的是li e.target 指向的就是li
                console.log(e.target);
            })
    
            // 了解兼容性
            // div.onclick = function(e) {
            //     e = e || window.event;
            //     var target = e.target || e.srcElement;
            //     console.log(target);
    
            // }
            // 2. 了解 跟 this 有个非常相似的属性 currentTarget  ie678不认识
        </script>
    </body>
    
    </html>
    
  • 相关阅读:
    定制自己的PHP语法-在PHP中实现unless
    欢迎使用CSDN-markdown编辑器
    在 Laravel 中通过 Artisan View 扩展包创建及删除应用视图文件
    直接可用的loading.js
    vue后退判断是否有历史记录,有就返回上一级,否则返回指定路由
    js防抖和节流
    IE增加Meta标签(IE=Edge,chrome=1)兼容IE问题
    如何覆盖 node_modules 里的文件
    js运行代码计时器
    vue打包font字体文件路径错误的问题处理
  • 原文地址:https://www.cnblogs.com/jianjie/p/12176891.html
Copyright © 2011-2022 走看看