事件 下

154 阅读5分钟

事件对象

其实就是一个对象,这个对象中记录了很多跟当前事件相关的信息,鼠标按键信息,记录鼠标点在浏览器的哪个位置了,哪个键盘 。。。

事件对象的获取方式:

1.通过一个形参来接收
2.通过window.event来接收 === event

绑定:给box对象的onclick属性赋值了一个函数

对象中如果键对应的值是一个函数的话,将这个键值对叫做对象的方法

对象的方法调用语法:对象.键() box.onclick()

当点击的时候,事件函数执行了,但是我们并没有看到这个函数调用的代码,这个调用代码应该在系统内部进行的 - 我们能不能给这个函数添加实参?不能,因为我们看不到小括号在哪里。定义函数的小括号(放形参的小括号)失去了作用了。

系统在调用事件函数的时候,给这个函数传入了一个实参 - 这个对象就叫事件对象

总结:

事件对象 - 系统在调用事件函数传入了一个实参对象,这个对象就是事件对象

事件对象的作用:记录了跟当前事件相关的很多信息

获取事件对象:

window.event
在正常的浏览器中,通过事件函数的第一个形参,也可以获取到的,在低版本ie中只能使用window.event来获取

事件类型

e.type // 事件的类型
 console.log( window.event.type );

阻止事件冒泡

事件对象.cancelBubble = true

鼠标按键信息

事件对象.button 代表当前鼠标按键信息;0-左键,1-滚轮,2-右键。

console.log( window.event.button)

键盘按键信息

事件对象.keyCode - 键盘按键码 console.log(window.event.keyCode)

每个字母和数字符号的按键码大致会遵循阿斯克码,但是每台计算机可能结果是不一样,小写就是小写的阿斯克码,小写就是大写的阿斯克码

键盘码:数字和字母他们的按键码就是阿斯克码;回车键的按键码13;空格的阿斯克码32;左上右下的按键码:37 38 39 40

组合键 - 有些键单独是没有什么作用的,通常会配合其他键才能实现功能:ctrl alt shift

事件对象中提供了几个属性用于判断是否按住了这几个组合键

ctrl - 事件对象.ctrlKey

alt - 事件对象.altKey

shift - 事件对象.shiftKey

总结:

事件对象.keyCode 代表按键码 - 数字字母对应阿斯克码(误差)
    回车:13
    空格:32
    上:38
    下:40
    右:39
    左:37
事件对象.ctrlKey - 返回布尔值,代表是否按住ctrl键
事件对象.altKey - 返回布尔值,代表是否按住alt键
事件对象.shiftKey - 返回布尔值,代表是否按住shift

获取鼠标点击的位置

1.获取鼠标在当前事件源上点击的位置

事件对象.offsetX

事件对象.offsetY

var e = window.event;

var x1 = e.offsetX

var y1 = e.offsetY

console.log(x1, y1);

2.获取鼠标在当前浏览器区域中的位置

事件对象.clientX

事件对象.clientY

var x2 = e.clientX
ar y2 = e.clientY
console.log(x2, y2);

3.获取鼠标在当前页面中的位置

事件对象.pageX

事件对象.pageY

var x3 = e.pageX
var y3 = e.pageY
console.log(x3, y3);

总结:

鼠标位置:
相对于标签:offsetX offsetY
相对于浏览器窗口:clientX clientY
相对于整个页面:pageX pageY

阻止默认行为

默认行为:自带的功能

有些标签不需要使用js事件操作,自动就能实现某些功能,例如a标签、form、鼠标右击

1.阻止默认行为 - 事件对象.returnValue = false

var e = window.event;
e.returnValue = false

2.在事件函数的末尾,添加 return false

return false

在阻止默认行为的过程中,如果在阻止默认行为的代码之前有报错,是阻止不了的

事件委托

有的标签懒得处理事件,交给别人去处理 - 父标签

为什么父标签可以代替子标签处理事件?因为点击子标签其实也在点击父标签

子标签能不能代替父标签处理事件?不能,点击了父,不一定会触发子标签的事件

事件委托的原理是什么?事件冒泡

如何在父标签的事件中找到当前正在点击的子标签

事件对象中有一个属性 target,可以获取到当前点击的更加精准的目标元素
console.log( window.event.target.innerText );

使用事件委托的好处:

  1. 提高性能(事件委托中并没有使用循环给每个节点设置事件,只给一个父元素ul绑定事件)
  2. 后续动态添加的节点也有事件的处理

注意:事件委托底层就是通过事件冒泡来完成的,先触发父元素的事件,在通过事件对象的target属性找到具体的目标元素,进而在处理目标元素要执行的业务逻辑。

事件对象总结

名称意义使用方式兼容问题
stopPropagation方法阻止冒泡e.propagation()e.cancelBubble=true
preventDefault方法阻止默认行为e.preventDefault()e.returnValue=false
clientX鼠标点击坐标e.clientX
offsetX鼠标点击坐标e.offsetX
pageX鼠标点击坐标e.pageX
target精准的事件源e.targete.srcElement
keyCode键盘码e.keyCodee.which
type事件类型e.type
button鼠标按键信息e.button

\