事件对象和事件中的this

218 阅读5分钟

事件对象

事件触发时对于事件处理函数,JS执行引擎会默认传一个实参就是事件对象,通常用形参event接收。Event对象(事件对象)存储着事件发生时的相关信息,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态等。

事件对象的信息

事件源对象

event.target:火狐只有这个

event.srcElement:IE6/78只有这个

这两个chrome都有

兼容性写法 var ele=event.target|| event.srcElement

鼠标事件触发时

altKey:鼠标事件发生时,是否按下alt键,返回一个布尔值

ctrlKey:鼠标事件发生时,是否按下ctrl键,返回一个布尔值

metaKey :鼠标事件发生时,是否按下windows/commond键,返回一个布尔值

shiftKey 鼠标事件发生时,是否按下shift键,返回一个布尔值

pageX:鼠标点击的X坐标;(包含body隐藏的,页面滚动到下方后上面body被隐藏的会包括),pageY:鼠标点击的Y坐标;(包含body隐藏的)

pageX,pageY:鼠标点击时鼠标距离页面(距离body)的左上角,pageX是距离body元素左上角的水平距离,pageY是距离body元素左上角的垂直距离(会加上滚动的距离)

clientX,clientY:返回鼠标位置相对于浏览器窗口左上角的坐标,单位为像素(不包括body隐藏的,页面滚动到下方后上面body被隐藏的不包括)。以body的左上角为原点,向右为X的正方向,向下为Y的正方向。

clientX,clientY:鼠标点击时鼠标距离页面的显示区域(浏览器页面可视区)的左上角(与页面是否有滚动无关)

在页面没有滚动时,page、client 的值相同,pageX,pageY页面滚动时不会改变,而clientX,clientY也会随着浏览器页面的滚动而改变。

314D1D74FF7D3A38B71EE433EA6F9CCF.png

screenX,screenY返回鼠标位置相对于屏幕左上角的坐标,单位为像素

1.screenX 鼠标点击的坐标距电脑屏幕水平方向的距离

2.screenY 鼠标点击的坐标距电脑屏幕垂直方向的距离

39F9836E7B660FEB462BC8D2B83F81A2.png

movementX,movementY返回一个位移值,单位为像素,表示当前位置与上一个mousemove事件之间的距离。点击事件中不会改变永远是0,在mousemove事件中光标移动时会持续触发,就会改变其值,有负数也有正数(由上一次触发mousemove事件的movementX,movementY减去下一次触发mousemove事件的movementX,movementY)

offsetX,offsetY:相对于元素自己的x/y,跟它是否是定位的元素无关。

1.offsetX:鼠标点击的坐标距元素自身水平方向元素的距离,不受滚动条影响

2.offsetY:鼠标点击的坐标距元素自身垂直方向元素的距离, 不受滚动条影响

3088FFF5DF671F9AFF00AAF420E88A30.png

image.png

输入框操作的事件对象

data:事件触发时,输入框输入的内容而不是输入框中的内容,输入框中的内容是元素节点的value值(获取元素节点可以先获取元素用变量引用,也可以通过事件触发时this对象,还可以通过事件对象中target获取事件源对象)

键盘事件触发时

charCode:指用户按下字符的编码

keyCode:表示用户按下键的实际的编码。

keydown和keyup::charCode值为0

keypress:charCode有值

结论:charCode返回keypress事件触发键值的字母代码,keyCode返回keydown或keyup事件的键的代码。

常用keyCode:37左,38上,39右,40下 ,13enter,键盘上的键名A是65,B是66

code:表示键盘输入的键名

key:表示输入的文字

altKey:事件发生时,是否按下alt键,返回一个布尔值

ctrlKey:事件发生时,是否按下ctrl键,返回一个布尔值

metaKey :事件发生时,是否按下windows/commond键,返回一个布尔值

shiftKey 鼠标事件发生时,是否按下shift键,返回一个布尔值

事件对象的type属性

type:返回要触发的事件类型,但事件类型不加on 比如:click,mouseover等

事件中的this

属性绑定事件

this表示绑定事件的元素,事件处理函数形参event是事件对象

    <button class="btn">按钮</button>
    <script>
        let btn=document.querySelector(".btn");
        btn.onclick=function(event){
            //事件处理函数形参event是事件对象
            console.log(event);
            console.log(this);
        };
     </script>

image.png

行内式绑定

行内式绑定的函数,就相当于在调用函数。行内绑定时,行内无法获取事件对象。

    <button class="btn" onclick="fn(100)">按钮</button>
    <script>
        function fn(arg){
            //形参arg接收传入的实参
            console.log(arg,111);
            //在行内式绑定中window.event事件对象
            console.log(window.event,222);
            console.log(this,333);
        };
     </script>

image.png

行内的环境对象是行内这个元素节点,而函数的调用者是window。所以此时函数中的this是window

    <button class="btn" onclick="fn(this)">按钮</button>
    <script>
        function fn(arg){
            //形参arg接收传入的实参
            console.log(arg,111);
            //在行内式绑定中window.event事件对象
            console.log(window.event,222);
            console.log(this,333);
        };
     </script>

行内的环境对象是行内这个元素,所以此时传入的实参this是行内这个元素节点,可在事件处理函数中用形参接收这个绑定事件的元素节点。

image.png

1.当行内式绑定传入了实参点击事件对象的兼容写法:

var event=(event.constructor==PointerEvent&&event)|| window.event

2.当行内式绑定没有传入实参点击事件对象的兼容写法:

var event=event|| window.event

3.在行内直接写代码无法传参,所有浏览器都支持window.event、event来获取当前正在被触发的对象的事件

<p onclick = "alter(event)"></p>
<p onclick = "alter(window.event)"></p>
<p onclick = "alter(arguments[0])"></p>

4.在行内调用函数可传参,也可直接调用

<script>
function test(e){
        console.log(e);//传参所有浏览器都可以输出当前被触发的事件
        //直接调用
        console.log(event);
        console.log(window.event);
    }
</scripy>
<body>
 <p>
    <input type="text" onclick="test(event)">
    //或
     <input type="text" onclick="test(window.event)">
 </p>
</body>

添加监听器绑定

    <button class="btn">按钮</button>
    <script>
        let btn=document.querySelector(".btn");
        btn.addEventListener("click",function(event){
            //事件处理函数形参event是事件对象
            console.log(event,1111);
            console.log(this,2222);
        });
    </script>

this表示绑定事件的元素,事件处理函数形参event是事件对象

image.png

当事件处理函数是箭头函数,函数中的this是箭头函数的外层作用域的this。