• JavaScript之事件机制、事件流、事件机制、鼠标事件,键盘事件


    addEventListener 事件监听方式 

    eventTarget.addEventListener()方法将指定的监听器注册到 eventTarget(目标对象)上,当该对象触发指定的事件时,就会执行事件处理函数。

    该方法接收三个参数:

    type:事件类型字符串,比如 click 、mouseover ,注意这里不要带 on

    listener:事件处理函数,事件发生时,会调用该监听函数

    useCapture:可选参数,是一个布尔值,默认是 false

    eventTarget.attachEvent()方法将指定的监听器注册到 eventTarget(目标对象) 上,当该对象触发指定的事件时,指定的回调函数就会被执行。

    该方法接收两个参数:

    eventNameWithOn:事件类型字符串,比如 onclick 、onmouseover ,这里要带 on

    callback: 事件处理函数,当目标触发事件时回调函数被调用

    注意:IE8 及早期版本支持

    11b5476a172644f5bcaa3c3e70c788ab.png

     删除事件的方式

    ae91de85f1fe47d589751255e7a31ace.png

    DOM 事件流

    事件流描述的是从页面中接收事件的顺序。

    事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即 DOM 事件流。

    比如我们给一个div 注册了点击事件:

    DOM 事件流分为3个阶段: 

    1. 捕获阶段

    2. 当前目标阶段

    3. 冒泡阶段

    事件冒泡: IE 最早提出,事件开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点的过程。

    事件捕获: 网景最早提出,由 DOM 最顶层节点开始,然后逐级向下传播到到最具体的元素接收的过程。

    06bc6b88a1b84e998a07ef54de36aa9f.png

    向水里面扔一块石头,首先它会有一个下降的过程,这个过程就可以理解为从最顶层向事件发生的最具体元素(目标点)的捕获过程;之后会产生泡泡,会在最低点( 最具体元素)之后漂浮到水面上,这个过程相当于事件冒泡

    07162b35cf964623a128ea11b4b0dba7.png

    事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即 DOM 事件流。

    注意

    JS 代码中只能执行捕获或者冒泡其中的一个阶段。

    onclick 和 attachEvent 只能得到冒泡阶段。

    addEventListener(type, listener[, useCapture])第三个参数如果是 true,表示在事件捕获阶段调用事件处理程序;如果是 false(不写默认就是false),表示在事件冒泡阶段调用事件处理程序。

    实际开发中我们很少使用事件捕获,我们更关注事件冒泡。

    有些事件是没有冒泡的,比如 onblur、onfocus、onmouseenter、onmouseleave

    什么是事件对象

    官方解释:event 对象代表事件的状态,比如键盘按键的状态、鼠标的位置、鼠标按钮的状态。

    简单理解:事件发生后,跟事件相关的一系列信息数据的集合都放到这个对象里面,这个对象就是事件对象 event,它有很多属性和方法。

    比如:  

    1. 谁绑定了这个事件。

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

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

    事件对象的使用语法

    d5c471e64a5e4b67800594695d0f020f.png

    74e4408fab054c0684e86cbc4f5c6ca7.png 

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

    1. 标准浏览器中是浏览器给方法传递的参数,只需要定义形参 e 就可以获取到。

    2. 在 IE6~8 中,浏览器不会给方法传递参数,如果需要的话,需要到 window.event 中获取查找。

    解决: e = e || window.event;

    e.target 和 this 的区别:

      this 是事件绑定的元素, 这个函数的调用者(绑定这个事件的元素) 

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

    6429c17a5e6a462180bfe17c32bf9a9b.png

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

    39a9fa6df15a4ffba54276bf87723e51.png

    阻止事件冒泡的两种方式

    事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点。

    事件冒泡本身的特性,会带来的坏处,也会带来的好处,需要我们灵活掌握。

    57b9af23fa714d90b5ea38bef941dd9d.png

     阻止事件冒泡的兼容性解决方案

    a0b617ef57c745459aef12ecd40209ec.png

    26c74e697b484b2dbc53133127454cdf.png 

    12493c80200f421390d0b15e20ec83f0.png 

    事件委托

    事件委托也称为事件代理, 在 jQuery 里面称为事件委派

    事件委托的原理

    不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。

    以上案例:给 ul 注册点击事件,然后利用事件对象的 target 来找到当前点击的 li,因为点击 li,事件会冒泡到 ul 上, ul 有注册事件,就会触发事件监听器。

    事件委托的作用

    我们只操作了一次 DOM ,提高了程序的性能。

    5956cc97c83e41149b2b3a265fdf77ae.png

    常用的鼠标事件

    a69660c3dd504762b978e902c7326f72.png

    52c387ef51bb49b182629203c325ded0.png

    event对象代表事件的状态,跟事件相关的一系列信息的集合。鼠标事件对象 MouseEvent 和键盘事件对象 KeyboardEvent

    8b4a6e7f48274b21b3f2e18b5ba8b7ca.png

    622a39811084451aaa2467e222919c38.png 

    跟随鼠标移动

    2be79858f24f49888d10fb2e740ce19b.png

    事件除了使用鼠标触发,还可以使用键盘触发。

    e20fcb1a46e646309ce08d8f55a3d816.png

    注意: 

    1. 如果使用addEventListener 不需要加 on

    2. onkeypress 和前面2个的区别是,它不识别功能键,比如左右箭头,shift 等。

    3.三个事件的执行顺序是: keydown -- keypress --- keyup

    3cf79e6976864602834413d4a9837fd4.png

     7b4f033e2448487d908e2cdbc37377fa.jpg

     f3a077a51413489ba9fcb91790eb2aa3.png

    模拟京东按键输入内容

    5535bf6cac0545d3a84b18419e4fd42d.png

    模拟京东快递单号查询案例

    3d1b6a6142684fbf925a5f4ed97fc599.png

     

  • 相关阅读:
    使用 Vue.js 和 Element Plus 实现自动完成搜索功能
    Abnova丨E (DIII) (WNV) 重组蛋白 中英文说明书
    Android Studio的安装
    rust迭代器
    有没有EDEM2021.2的Linux版本
    misc类设备驱动0——板载蜂鸣器驱动测试
    java 企业工程管理系统软件源码 自主研发 工程行业适用
    【MySQL知识点】自动增长
    nginx设置开启自启动
    ConfigurationManager姿势快闪
  • 原文地址:https://blog.csdn.net/weixin_53155105/article/details/126235462