文章目录

  • 01.DOM概述
  • 02.DOM事件概述
  • 03. 事件类型
  • 04.事件对象
  • 05.事件的监听
  • 06.事件的捕获和冒泡
  • 07.阻止事件冒泡的方式

01.DOM概述

Document Object Model (DOM)文档对象模型:将标记语言文档的各个组成部分,封装为对象,可以使用这些对象,对标记语言文档进行CRUD(增删改查)的动态操作。

通过 HTML DOM,可访问 HTML 文档的所有元素,当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model),HTML DOM 模型被构造为对象的树。

提示:Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问。

02.DOM事件概述

DOM事件:浏览器用户可以对HTML页面做出某种动作,如浏览器加载页面后用户点击鼠标时等,我们称这些动作为DOM事件。

事件是用户和页面交互的核心,当动作发生(事件触发)时,我们可以为这个动作(事件类型)绑定一个或多个处理事件的函数,通过这些绑定的函数来完成我们想要实现的功能。

举例如下:当我们点击页面中的请点击我!的时候,会触发一个弹窗事件,弹出hello!!!

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>demo</title></head><body><div id="root">请点击我!</div></body><!-- JS代码 --><script type="text/javascript">// 通过DOM元素的id选择需要添加事件的DOM元素var root= document.getElementById("root");// 显示在控制台console.log(root);// 给该DOM元素添加一个事件,该事件的类型是onclick点击事件,事件对应的处理函数为弹窗root.onclick = function (){alert("hello!!!"); };</script>
</html>

总结一下,事件的三要素:

  • 事件源(是谁发生了事情):例子中的div标签
  • 事件类型(发生了什么事):鼠标点击了该div标签
  • 事件处理函数(怎么应对):弹出一个弹窗

03. 事件类型

当我们想HTML分配事件的时候,要先确定事件的类型,如上面的例子使用的事件类型就是点击事件

HTML中的事件类型有很多:鼠标事件框架/对象事件表单事件打印事件拖动事件多媒体事件动画事件过度事件等。

  • 鼠标事件:点击鼠标发生的事件
  • 表单事件:处理表单使用的事件

具体参考:HTML DOM 事件

下面就演示几个比较简单的鼠标事件:

  • 鼠标点击事件:

    • 事件类型:onclick
    • 功能:当用户双击某个对象时,调用的事件句柄(事件对应的函数)
    <!DOCTYPE html>
    <html><head><meta charset="UTF-8" /><title>demo</title></head><body><div id="root">请双击我!</div></body><script type="text/javascript">var root= document.getElementById("root");console.log(root);root.ondblclick = function (){alert("hello!!!"); };</script>
    </html>
    
  • 鼠标移动事件:
    • 事件类型:onmouseout
    • 功能:当鼠标从某个元素上移开时,调用的事件句柄(事件对应的函数)
    <!DOCTYPE html>
    <html><head><meta charset="UTF-8" /><title>demo</title></head><body><div id="root">从我身上移开!</div></body><script type="text/javascript">var root= document.getElementById("root");console.log(root);root.onmouseout = function (){alert("hello!!!"); };</script>
    </html>
    

04.事件对象

每当有事件被触发,浏览器都会记录当前事件触发的详细信息,并把它们封装成一个对象,可以传递给事件处理函数,我们可以获取到该事件对象,事件对象也有自己的属性方法

  • 事件属性:

    • target:返回触发此事件的DOM元素
    • type:返回当前事件对象的事件属性。
    • 等等
  • 事件方法:
    • stopPropagation():不再派发事件
    • 等等

事件绑定方式:

  • element.on+事件类型(type) = function (event){};

举个例子:

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>demo</title></head><body><div id="root">事件对象相关的属性和方法验证请在控制台查看!!</div></body><script type="text/javascript">var root= document.getElementById("root");root.onmouseout = function (event){var event=event || window.event;  // 获取事件对象的兼容处理console.log(event); // 打印事件对象本身console.log(event.target); // 返回触发此事件的DOM元素console.log(event.type);   // 返回当前事件对象的事件属性。};      </script>
</html>

05.事件的监听

监听绑定方式:

  • element.addEventListener(事件类型,function,boolean);
  • 同一事件类型可以绑定一个或多个事件处理程序,IE老版本不兼容。
  • 也可以在第二个参数的位置直接使用匿名函数

举个例子:

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>demo</title></head><body><div id="root">点击事件!!</div></body><script type="text/javascript">var root= document.getElementById("root");// 点击事件root.onclick = function (){alert("hello!!")}; //给点击事件添加事件监听:只要点击就触发root.addEventListener("click",testListener,false);function testListener(){alert("监听点击事件:onclick")}; </script>
</html>

监听解除方式:

  • element.removeEventListener(事件类型,function,false);
<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>demo</title></head><body><div id="root">点击事件!!</div></body><script type="text/javascript">var root= document.getElementById("root");// 点击事件root.onclick = function (){alert("hello!!")}; //给点击事件添加事件监听:只要点击就触发root.addEventListener("click",testListener,false);//给点击事件去除事件监听root.removeEventListener("click",testListener,false);function testListener(){alert("监听点击事件:onclick")}; </script>
</html>

另外:IE有个独有的方法obj.attchEvent(‘on’+type,function);,功能和监听方式一样。

解除方式是:element.detachEvent(‘on’+type,function);

注意:如果绑定的是匿名函数,则无法解除。

06.事件的捕获和冒泡

事件流:

  • 当事件发生时,会在发生事件的元素节点与DOM树根节点之间按照特定的顺序进行传播, 这个过程称之为事件流
  • 即当页面触发一个事件时,会按照一定的顺序来响应事件,事件的响应过程称为事件流。

事件流分类:

  • 冒泡型事件流
  • 捕获型事件流

事件冒泡:事件由子元素传递到父元素的过程叫做冒泡(false)。

  • 事件响应顺序向上响应):文本节点–>元素节点—>body—>html—>document

捕获事件:事件由父元素传递到子元素的过程叫做事件捕获(ture)。

  • 事件响应顺序向下响应):document–>html–>body–>元素节点–>文本节点

监听方式根据提供的第三个参数设置事件捕获冒泡true则在捕获阶段false则在冒泡阶段(默认)

举个例子:

<!DOCTYPE html>
<html><head><meta charset="UTF-8" /><title>demo</title></head><body><div id="father"><div id="son">事件的捕获与冒泡</div></div></body><script type="text/javascript">// 通过id方式获取父组件var father=document.getElementById("father");// 通过id方式获取子组件var son=document.getElementById("son");// 监听的时候绑定的第三个参数是false为冒泡方式,也是默认的方式。// 点击后会先弹出:子组件// 点击确认后再弹出:父组件// 监听的时候绑定的第三个参数是true为捕获方式// 点击后会先弹出:父组件// 点击确认后再弹出:子组件// 监听父组件的点击事件father.addEventListener("click",fatherListener,false);// 监听子组件的点击事件son.addEventListener("click",sonListener,false);// 监听之后执行的函数function fatherListener(){alert("父组件");}; function sonListener(){alert("子组件");}; </script>
</html>

07.阻止事件冒泡的方式

方式一:事件委托

  • 事件委托的功能:当子元素个数很多或不确定,且每个子元素都需要绑定执行类似功能的事件处理函数时,通过在父元素上绑定该事件处理函数,在函数内部获取事件源对象(某子元素),通过事件冒泡机制,确保能让每个子元素在被触发相应事件时,事件处理函数都能被正确执行。

  • 事件对象有两个属性,targetsrcElement(IE),它存储的是事件源对象,即实际触发该事件的对象,不是捕获的,也不是冒泡的,通过事件源对象,可以轻松实现事件委托功能。

  • 举个例子:

    <!DOCTYPE html>
    <html><head><meta charset="UTF-8" /><title>demo</title></head><body><div id="root"><ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul></div>    </body><script type="text/javascript">// 一个数目很多的列表,我们要实现的功能是点击每个li都弹出它自己的内容// 通过id方式获取根组件var root=document.getElementById("root");// 在根组件上绑定函数,根据冒泡机制,当点击子组件时,会以冒泡的形式向上层层触发// 在子组件中不做处理,统一委派到根组件处理root.onclick = function (event){var event = event || window.event;// 获取产生事件的对象(子组件本身)target = event.target || event.srcElement;// 控制台查看console.log(target); alert(target.innerText);};</script>
    </html>
    

方式二:阻止事件冒泡

  • event.stopPropagation():可以阻止事件冒泡,阻止触发父级元素绑定的事件。
  • 举个例子:
    <!DOCTYPE html>
    <html><head><meta charset="UTF-8" /><title>demo</title></head><body><div id="father"><div id="son">阻止事件冒泡</div></div></body><script type="text/javascript">// 通过id方式获取父组件var father=document.getElementById("father");// 通过id方式获取子组件var son=document.getElementById("son");// 监听父组件的点击事件father.addEventListener("click",fatherListener,false);// 监听子组件的点击事件son.addEventListener("click",sonListener,false);// 监听之后执行的函数function fatherListener(){alert("父组件");}; function sonListener(event){alert("子组件");event.stopPropagation();   //阻止事件冒泡}; </script>
    </html>
    

DOM以及DOM事件的处理方式相关推荐

  1. JavaScript三种事件绑定的方式(DOM的0级、2级、3级事件处理程序)

    JS事件绑定的方式: ①.行内绑定 ②.动态绑定 ③.事件监听 一.行内绑定[DOM0级事件处理程序]: 例:<标签 属性列表 事件="事件的处理程序" /> 虽然可以 ...

  2. jQuery学习笔记之DOM操作、事件绑定(2)

    jQuery学习笔记之DOM操作.事件绑定(2) --------------------学习目录------------------------ 4.DOM操作 5.事件绑定 源码地址: https ...

  3. DOM及DOM二级事件

    DOM Document Object Model 文档对象模型 javascript由三部分组成:ECMAScript.BOM.DOM DOM提供API来操作HTML页面,如:document下面的 ...

  4. JavaScript基础11-day13【正则表达式(量词、语法、转义字符、元字符)、DOM(节点、事件)、图片切换】

    学习地址: 谷粒学院--尚硅谷 哔哩哔哩网站--尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通) JavaScript基础.高级学习笔记汇总表[尚硅谷最新版Ja ...

  5. jquery中DOM加载事件,onload事件和ready事件

    全栈工程师开发手册 (作者:栾鹏) jquery系列教程4-事件操作全解 jquery中DOM加载事件 jquery中的DOM加载事件分为onload事件和ready事件.,具体功能如代码中注释. 代 ...

  6. jQuery 选择器、DOM操作、事件、动画

    $(document).ready(function(){}) $(function(){}) 如果获取的对象是jQuery对象,那么在变量前面加上$,例如:var $variable=jQuery对 ...

  7. DOM对象之事件对象(Object《Event》)

    DOM对象之事件对象(Object<Event>) HTML DOM 事件(DOM Objext:<Event>)允许Javascript在HTML文档元素中注册不同事件处理程 ...

  8. 不同dom的blur事件和click事件发生冲突

    直接上测试代码 <!DOCTYPE html> <html lang="en"> <head><title>不同dom的blur事件 ...

  9. 动态生成的dom为什么绑定事件会失效,以及如何解决

    之前做项目都是直接用jquery的bind绑定事件,不过当时都不是动态生成dom元素,而是已经页面中原本存在的dom元素进行事件绑定,最近在测试给动态生成的dom绑定事件的时候发现事件失效,于是就测试 ...

  10. js动态添加html元素绑定事件,JS实现动态添加DOM节点和事件的方法示例

    本文实例讲述了JS实现动态添加DOM节点和事件的方法.分享给大家供大家参考,具体如下: 运行效果图如下: 完整实例代码如下: /p> "http://www.w3.org/TR/xht ...

最新文章

  1. python系列------计算机运算过程
  2. Spring、Spring Boot和TestNG测试指南 - 测试关系型数据库
  3. python3 多级目录建立 os.makedirs()
  4. jQuery Ajax详解
  5. 判断.java文件中getConnection与cleanUp数量是否匹配
  6. 【模板】分散层叠算法(P6466)
  7. 【SR汇总】基于深度学习方法
  8. Oracle run leve,UNIX自动启动oracle
  9. 51nod 1640 天气晴朗的魔法
  10. 远程办公软件华为云WeLink视频会议指南(下篇:记录会议纪要)
  11. 二阶常系数微分方程求解步骤
  12. import * as x from 'xx' 和 import x from 'xx'
  13. vue一维码,二维码生成
  14. Locust学习笔记5——登录接口参数关联
  15. oracle重做日志教程,Oracle重做日志管理
  16. 软件开发流程与初始软件测试
  17. bpm,bpm千万里我找的就是你!!
  18. CF-Watermelon
  19. 【Matlab】构造布朗运动
  20. 新版MT4基础架构函数

热门文章

  1. 解除百度云下载限制速度(谷歌浏览器)
  2. HBuilder的常用快捷键
  3. 微信壁纸小程序(SpringBoot后台V1.3.0发布)
  4. Python3快速入门—5.函数
  5. el-form的model、prop属性和表单校验等详解
  6. 华夏出入口车牌识别摄像机
  7. linux下at的用法,详解Linux系统中at与atq命令的用法
  8. 3.1 Vendor Model浅析
  9. Passenger简介
  10. 2011年,痛并快乐着