javascript三种事件模型 + Dom事件流 +事件委托

news2024/12/25 1:19:47

目录

    • 三种事件模型
        • ● DOM0 级模型:
        • ● IE 事件模型:
        • ● DOM2 级事件模型:
    • DOM事件流
    • 事件委托
    • target/currentTarget/relateTarget的区别

三种事件模型

● DOM0 级模型:

这种模型不会传播,所以没有事件流的概念,但是现在有的浏览器支持以冒泡的方式实现,它可以在网页中直接定义监听函数,也可以通过 js 属性来指定监听函数。这种方式是所有浏览器都兼容的。

● IE 事件模型:

在该事件模型中,一次事件共有两个过程,事件处理阶段,和事件冒泡阶段
事件处理阶段会首先执行目标元素绑定的监听事件。然后是事件冒泡阶段,冒泡指的是事件从目标元素冒泡到 document,依次检查经过的节点是否绑定了事件监听函数,如果有则执行。

● DOM2 级事件模型:

在该事件模型中,一次事件共有三个过程,第一个过程是事件捕获阶段。捕获指的是事件从 document 一直向下传播到目标元素,依次检查经过的节点是否绑定了事件监听函数,如果有则执行。后面两个阶段和 IE 事件模型的两个阶段相同。这种事件模型,事件绑定的函数是 addEventListener,其中第三个参数可以指定事件是否在捕获阶段执行。

DOM事件流

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

在这里插入图片描述

  • 事件捕获阶段
    ■ 事件捕获:事件从最不精确的对象(document 对象)开始触发,然后到最精确
    ■ 事件从 Document 节点自上而下向目标节点传播的阶段;
  • 处于目标阶段
    ■ 事件目标:当到达目标元素之后,执行目标元素该事件相应的处理函数。如果没有绑定监听函数,那就不执行。
  • 事件冒泡阶段
    ■ 事件冒泡:事件按照从最特定的事件目标到最不特定的事件目标(document 对象)的顺序触发,当一个元素接收到事件的时候会把他接收到的事件传给自己的父级,一直到 window 。
    ■ 事件从目标节点自下而上向 document 节点传播的阶段。
    ■ 不产生冒泡的事件:abort、blur、focus、load、unload、mouseenter、mouseleave、resize
    和自定义事件

● 阻止冒泡和捕获用 e.stopPropagation(),event.cancelBubble; // IE 6 7 8 的停止冒泡;
● 阻止默认事件用 e.preventDefaule(),e.returnValue; 是一个属性,适用于 IE 6 7 8;

  • 注意:
    • JS 代码只能执行捕获或者冒泡其中的一个阶段
    • onclick 和 attachEvent 只能得到冒泡阶段
    • ○ addEventListener(type, listener[, useCapture]) 第三个参数如果是true,表示在事件捕获阶段调用事件处理程序;如果是 false(不写默认是 false),表示在事件冒泡阶段调用事件处理程序。
    • ○ 有的事件是没有冒泡的,如:onblur、onfocus、onmouseenter、onmouseleave 等。

事件委托

事件委托的原理

1,事件委托也叫事件委派,就是利用 DOM 的冒泡事件流,注册最少的监听器,实现对 DOM
节点的所有子元素进行事件群控。
2,事件委托的原理:不给每个子节点单独设置事件监听器,而是设置在其父节点上,然后利用冒泡原理设置每个子节点。(给 ul注册点击事件,然后利用事件对象的 target 来找到当前点击的 li ,然后事件冒泡到 ul 上ul有注册事件,就会触发事件监听器。)

○ 事件委托的作用

只操作了一次 DOM ,提高了程序的性能。
每一个事件处理函数,都是一个对象,那么多一个事件处理函数,内存中就会被多占用一部分空间。如果要用事件委托,就会将所有的操作放到 js 程序里面,只对它的父级(如果只有一个父级)这一个对象进行操作,与 dom 的操作就只需要交互一次,这样就能大大的减少与 dom的交互次数,提高性能。

target/currentTarget/relateTarget的区别

● event.target

  • 返回触发事件的元素
  • 可以用来实现事件委托 (event delegation)

● event.currentTarget

  • 返回绑定事件的元素

● event.relateTarget

  • 返回与事件的目标节点相关的节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang远程调试Debug环境

目录背景软件版本环境搭建安装Golang环境安装dlv环境启动远程环境Goland 连接远程环境参考背景 最近在做 Operator 的二次开发,开发语言是Golang。Operator 开发时候需要用到k8s集群,遗憾的是k8s编排的容器网络与本地网络不通,无法直接进行d…

十部必看特种部队电影之《勇者行动》

这部特种部队题材电影是馆长收藏了很久的网盘资源,今天拿出来分享给大家。

远程直接连接 MySQL 数据库,阿里云腾讯云允许远程连接教程

不使用SSH登录远程主机直接连接远程数据库 文章目录修改MySQL登录权限1、登录MySQL2、修改mysql库的user表3、防火墙开放3306端口Navicat直接连接远程数据库报错【报错】Cant connect to MySQL server (10060)1、网络问题2、mysql账户设置3、防火墙端口未开放4、查看云服务器商…

JWT -- Json Web token

JWT 的背景知识可以看这篇文章: JSON Web Token 入门教程 JWT 由三个部分组成: Header(头部)Payload(负载)Signature(签名) 在分布式系统下,存在跨session的问题,则使用…

[附源码]Python计算机毕业设计Django毕业生就业管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

cdn加速华为云obs桶文件配置过程(详细)

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 前言 前面写了一篇文章,jeecg-boot中上传图片到华为云obs云存储中 主要介绍了下,如何使用jeect-boot微服务将文件上传至obs中。 但是上传是没有问题,…

目前看过最全的一线大厂面试题(题 + 详解),你所不知道的都在这

前言 在过 1 个月即将进入 2023,然而面对今年的大环境而言,跳槽成功的难度比往年高了很多,很明显的感受就是:对于今年的 java 开发朋友跳槽面试,无论一面还是二面,都开始考验一个 Java 程序员的技术功底和…

FL Studio2022水果编曲音乐制作软件自带完整插件

FL Studio 2022是一款非常好用的音乐制作软件,又称水果编曲软件,软件集合了录音、混音、编辑等多种功能于一体,能够完成各种各样的音乐编曲工作,强大的音乐制作功能受到了很多用户的喜爱,帮你完成各种类型音乐的编曲制…

《500强高管谈VE》-企业经营与VE活动

文章出处:日本VE协会杂志文章翻译:泰泽项目部 关注泰泽:实现高利润企业 《500强高管谈VE》-企业经营与VE活动 作者:兄弟工业常务董事渡边共祥 由墨西哥货币不稳定引发的此次日元升值,一度跌破80日元,呈现…

Servlet程序及部署方式(Tomcat+Smart Tomcat)

目录 1、Servlet是什么? 2、Servlet程序【例——hello world】 2.1、创建项目 2.2、引入Servlet依赖 2.3、创建目录结构 2.4、编写代码 2.5、打包程序 2.6、部署程序 2.7、验证程序 3、更方便的部署方式——Smart Tomcat 1、Servlet是什么? Se…

初识计算机网络

目录 网络的发展 重新看待计算机结构 大型存储平台 认识 "协议" 网络和OS之间的关系 初识网络协议 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 局域网通信的原理 如果进行跨网络传输 网络通信里面的基本轮廓 数据包封装和分用…

多线程同步

文章目录一、多线程同步竞争与协作互斥的概念同步的概念互斥与同步的实现和使⽤锁信号量⽣产者-消费者问题经典同步问题读者-写者问题一、多线程同步 竞争与协作 在单核 CPU 系统⾥,为了实现多个程序同时运⾏的假象,操作系统通常以时间⽚调度的⽅式&am…

为dev c++配置图形开发环境easyx之mingw32

easyx官方的文档在说明如何配置环境上面不太详细,所以就有了我的那篇博文为dev c配置图形开发环境easyx,默认的是在64位的编译器TDM-gcc下配置的,也就是我们配置的easyx最终都是放在mingw64文件夹下的,5.1版本后的dev c内置的编译…

什么是分层架构

👨‍💻个人主页:微微的猪食小窝 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 微微的猪食小窝 原创 1、什么是架构分层? 分层架构是将软件模块按照水平切分的方式分成多个层,一个系统由多层组成…

同时安装Vue2和Vue3

背景 当我们的工作中使用的还是脚手架还是基于Vue2.x的版本,那么我们想要学习和使用Vue3怎么办?直接升级脚手架的话,会影响到我们现在的项目,那就需要去处理下关于Vue3的东西了。 下载安装Vue3的脚手架 任意磁盘根目录新建一个文件…

【深入理解C++】new/delete和new[]/delete[]探秘

文章目录1.operator new()和operator delete()2.new记录分配的内存大小供delete使用3.new[]/delete[]申请和释放一个数组3.1 基本数据类型(内置类型)3.2 自定义类型(类类型)4.new/delete和new[]/delete[]要配对使用1.operator new…

开发 Chrome 扩展 之 Hello World 心血来潮

开发 Chrome 扩展 Hello, World 项目加载未打包的扩展icon刷新引入 JS 与错误处理 开发 Chrome 扩展 开发 Chrome 扩展除了需要基本的 HTML, CSS, JS 之外, 还可以使用 Chrome 额外提供的 API. 除了需要的 .html, .css 和 .js 文件之外呢, 扩展还包括不同类型的文件, 具体可…

杨辉三角形(Java版)

不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。 文章目录1. 什么是杨辉三角形2. 实现思路(方式)2.1 递归方式2.2 递归…

Nginx简单使用

安装龙蜥操作系统 镜像文件在这里下载就行 下载之后新建虚拟机 ISO选择刚才下载文件即可 具体配置可以照我来 也可自定义 基本工具安装 安装一下最基本的网络工具 yum install net-tools openssh-server wget tar make vim -y测试一下ssh连接 方便后期操作 修改主机名 …

Jedis 使用教程总结

一、Redis 常用命令 1 连接操作命令 quit:关闭连接(connection)auth:简单密码认证help cmd: 查看 cmd 帮助,例如:help quit 2 持久化 save:将数据同步保存到磁盘bgsave&#xff…