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>
    
  • 相关阅读:
    C#中关于@的用法
    c++ 中__declspec 的用法
    #pragma详细解释(一)
    memmove 和 memcpy的区别
    【niubi-job——一个分布式的任务调度框架】----安装教程
    [异能程序员]第一章 酒后事发(第一更)
    博客园的最后一篇博文,还是要离开了(附带个人博客源码分享)
    五一假期——技术之路上的坎儿
    deerlet-redis-client添加集群支持,邀请各路大神和菜鸟加入。
    从日常开发说起,浅谈HTTP协议是做什么的。
  • 原文地址:https://www.cnblogs.com/jianjie/p/12176891.html
Copyright © 2011-2022 走看看