DOM事件对象

613 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

事件对象

什么是事件对象?

  1. event就是一个事件对象 写到我们侦听函数的小括号里面,可以当形参来看

  2. 事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数

  3. 事件对象 是 我们事件的一系列相关数据的集合 跟事件相关的 比如鼠标点击里面就包含了鼠标的相关信 息:鼠标坐标之类的。如果是键盘事件里面就包含了键盘的事件信息,比如判断用户按下了哪个键

  4. 这个事件对象我们可以自己命名,一般是event、evt或者更简单的e

  5. 事件对象也有兼容性问题 ie678只能通过window.event 那么兼容性写法是 e = e || window.event一般不太考虑兼容性问题了,实际开发直接写event就好了

例如:

        //事件对象
        var div = document.querySelector('div');
        div.onclick = function (event) {
            console.log(event);
            console.log(window.event); //ie678的用这句
            event = event || window.event; //兼容性写法
            console.log(event);
        } //以前我们注册完事件后绑定事件的function中的()是没有参数的,其实里面可以有一个参数event

        div.addEventListener('click', function (e) {
            console.log(e);
        })

总结:
事件对象是写在函数小括号里面当形参来看的,它是与事件相关的,必须有了事件才会有事件对象。官方解释:event对象代表事件的状态,比如键盘按键状态、鼠标的位置、鼠标按钮的状态。简单理解:事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象event,它有很多属性和方法。

常见事件对象的属性和方法

e.target返回触发事件对象

e.target返回的是触发事件的对象(元素) 、this返回的是绑定事件的对象(元素)

        var div = document.querySelector('div');
        var ul = document.querySelector('ul');
        
        div.addEventListener('click', function (e) {
            console.log(e.target);// <div></div>
            console.log(this);// <div></div>
        })
        
        ul.addEventListener('click', function (e) {
            console.log(this); //因为是ul绑定的事件,所以this返回的是ul
            console.log(e.target); //触发的对象是li,返回的是li
            console.log(e.currentTarget); //与this相似
        })

image.png
同样的,e.target是标准的,但也有兼容性问题,ie678不认识它,ie678只认识e.srcElement,这个方法和e.target是一样的,返回的是触发事件的对象。所以我们了解一下下面的兼容性写法,因为ie678不认识监听事件方法,所以我们只能采取传统方式进行注册事件

        div.onclick = function (e) {
             e = e || window.event;
             var target = e.target || e.srcElement;
             console.log(target);
         } 

还有一个与this非常相似的属性 currentTarget,也是返回触发事件的对象,了解即可 同样也有兼容性问题,ie678不认识。

e.type返回事件类型

        var div = document.querySelector('div');
        div.addEventListener('click', fn);
        div.addEventListener('mouseover', fn);
        div.addEventListener('mouseout', fn);

        function fn(e) {
            console.log(e.type);
        }

image.png
当鼠标经过div盒子、点击、和离开div盒子,都触发了事件,并返回了事件类型

e.preventDefault()阻止对象默认行为

比如阻止链接跳转,阻止提交到表单

        var a = document.querySelector('a');
        // (1)方法监听注册方式
        a.addEventListener('click', function (e) {
            e.preventDefault(); //该方法阻止默认事件(行为) 是标准方法
        })

            // (2)传统的注册方式
            a.onclick = function (e) {
            return false; 
            alert('1');
        }

e.preventDefault() 适用于普通浏览器阻止默认行为的标准方法。
e.returnValue适用于低版本 ie678 阻止默认行为的属性。
或者直接使用return false 也能阻止默认行为, 没有兼容性问题。
如上面代码,return false虽然不错,但是return后面如果有代码就执行不了啦.并且return false阻止默认行为只适用于传统的注册方式。

常见的鼠标事件

1.禁止鼠标右键菜单
contextmenu主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单

        document.addEventListener('contextmenu', function (e) {
            //再利用事件对象阻止默认行为
            e.preventDefault();
        });

2.禁止鼠标选中(selectstart 开始选中)

    document.addEventListener('selectstart', function (e) {
            //再利用事件对象阻止默认行为
            e.preventDefault();
        });

以及其他的 点击事件click、双击事件dbclick、鼠标按下mousedown、鼠标抬起mouseup、鼠标移动mousemove、滚轮滑动wheel、鼠标移入移出mouseenter/mouseleave、鼠标经过离开mouseover/mouseout等

mouseover事件和mouseenter事件,都是鼠标进入一个节点时触发。两者的区别是,mouseenter事件只触发一次,而只要鼠标在节点内部移动,mouseover事件会在子节点上触发多次。

鼠标事件对象

如果你的事件是鼠标触发的,那么你的事件对象也是鼠标事件对象
可以试着在触发的事件处理函数中输出 事件对象,查看自带的属性

鼠标事件对象常见的属性:
e.clientX : 返回鼠标相对于浏览器窗口可视区的X坐标
e.clientY : 返回鼠标相对于浏览器窗口可视区的Y坐标
e.pageX : 返回鼠标相对于文档页面的X坐标,IE9以上支持
e.pageY : 返回鼠标相对于文档页面的Y坐标,IE9以上支持
e.screenX : 返回鼠标相对于电脑屏幕的X坐标
e.screenY : 返回鼠标相对于电脑屏幕的Y坐标

示例

        document.addEventListener('click', function (e) {
            // console.log(e); //得到MouseEvent 里面很多属性
            
            // 1.client 鼠标在浏览器可视区的坐标
            console.log(e.clientX);
            console.log(e.clientY); 
            //不管你的body高是几千px也好,我都是相对于我当前浏览器可是窗口来返回坐标的

            // 2.鼠标在文档的坐标
            console.log(e.pageX);
            console.log(e.pageY);

            // 3.鼠标距离屏幕的坐标
            console.log(e.screenX);
            console.log(e.screenY);
        })

常见的键盘事件

常用的键盘事件
onkeyup : 某个键盘按键被松开时触发
onkeydown : 某个键盘按键被按下时触发
onkeypress : 某个键盘按键被按下时触发(但是它不识别功能键,比如ctrl和shift箭头等等)

        // 1.onkeyup键盘弹起时触发
        document.onkeyup = function () { //传统方式注册
            console.log('我弹起了!--onkeyup');
        }
       

        // 2.onkeydown键盘按下触发
        document.onkeydown = function () { //传统方式注册
            console.log('我按下了!--onkeydown');
        }

        // 3.onkeypress 按下时触发
        document.onkeypress = function () { //传统方式注册
            console.log('我按下了!--onkeypress'); //onkeypress不识别功能键
        }

注意:
三个事件的执行顺序,先是keydown 然后是keypress 最后是keyup

键盘事件对象

同理,如果事件是由键盘触发的,那么事件对象就是键盘事件对象
介绍一些常用的
键盘事件对象中的keyCode属性可以得到相应键的ASCII码值
注意:

  1. keyup 和 keydown事件不区分字母大小写 a 和 A都是65
  2. keypress事件不区分字母大小写 a 和 A得到的都是65
    e.KeyCode
        document.addEventListener('keyup', function (e) {
            // console.log(e); //输出KeyboardEvent,里面有很多属性
            console.log('up' + e.keyCode);
            //可以利用KeyCode返回的ASCII码值来判断用户 比如
            if (e.keyCode === 65) {
                alert('您按下了a');
            } else {
                alert('您没有按下a');
            }
        })
        document.addEventListener('keypress', function (e) {
            console.log('press' + e.keyCode);
        })