DOM 事件深入浅出(一)

DOM级别与DOM事件

DOM级别一共可以分为4个级别:DOM0级DOM1级DOM2级DOM3级,而DOM事件分为3个级别:DOM0 级事件处理,DOM2 级事件处理和 DOM3 级事件处理。如下图所示:
DOM级别
为什么没有DOM1级事件处理呢?
因为1级 DOM 标准中并没有定义事件相关的内容,所以没有所谓的1级 DOM 事件模型。

1.DOM0级事件

在了解 DOM0 级事件之前,我们有必要先了解下 HTML 事件处理程序,也是最早的这一种的事件处理方式,代码如下:

<button type="button" onclick="showFn()"></button>

<script>
    function showFn() {
        alert('Hello World');
    }
</script>

以上代码我们通过直接在 HTML 代码里定义了一个 onclick 的属性触发 showFn 方法,这样的事件处理程序最大的缺点就是 HTMLJS 强耦合,我们一旦需要修改函数名就得修改两个地方。当然其优点是不需要操作 DOM 来完成事件的绑定。

那么什么是DOM0级处理事件呢?DOM0级事件就是将一个函数赋值给一个事件处理属性,比如:

<button id="btn" type="button"></button>

<script>
    var btn = document.getElementById('btn');
    
    btn.onclick = function() {
        alert('Hello World');
    }
    
    // btn.onclick = null; 解绑事件 释放占用内存;
</script>

以上代码我们给 button 定义了一个 id,通过 JS 获取到了这个 id 的按钮,并将一个函数赋值给了一个事件处理属性 onclick,这样的方法便是 DOM0级 处理事件的体现。我们可以通过给事件处理属性赋值null来解绑事件。

DOM0 级事件处理程序的缺点在于同一个处理程序无法同时绑定多个处理函数,比如我还想在按钮点击事件上加上另外一个函数。比如:

<button id="btn" type="button"></button>

<script>
    var btn = document.getElementById('btn');
    
    btn.onclick = function() {
        alert('Hello World');
    }  // 被覆盖,并不执行
    btn.onclick = function() {
        alert('Hello JavaScript');
    }
    
    // btn.onclick = null; 解绑事件 释放占用内存;
</script>
2.DOM2级事件

DOM2级 事件在 DOM0 级事件的基础上弥补了一个处理程序无法同时绑定多个处理函数的缺点,允许给一个处理程序添加多个处理函数。代码如下:

<button id="btn" type="button"></button>

<script>
    var btn = document.getElementById('btn');
    
    function showFn() {
        alert('Hello World');
    }
    
    btn.addEventListener('click', showFn, false);
    
    // btn.removeEventListener('click', showFn, false); 解绑事件 
</script>

DOM2级 事件定义了 addEventListenerremoveEventListener 两个方法,分别用来绑定和解绑事件,方法中包含3个参数,分别是绑定的事件处理属性名称(不包含on)、处理函数和是否在捕获时执行事件处理函数。如果我们还需要添加一个鼠标移入的方法,只需要:

btn.addEventListener('mouseover', showFn, false);

这样点击按钮和鼠标移入时都将触发showFn方法。

需要注意的是IE8级以下版本不支持 addEventListenerremoveEventListener,需要用attachEvent和detachEvent来实现:

btn.attachEvent('onclick', showFn); // 绑定事件 
btn.detachEvent('onclick', showFn); // 解绑事件 

这里我们不需要传入第三个参数,因为IE8级以下版本只支持冒泡型事件。

3.DOM3级事件

DOM3 级事件在 DOM2 级事件的基础上添加了更多的事件类型,全部类型如下:

UI事件,当用户与页面上的元素交互时触发,如:loadscroll
焦点事件,当元素获得或失去焦点时触发,如:blurfocus
鼠标事件,当用户通过鼠标在页面执行操作时触发如:dbclickmouseup
滚轮事件,当使用鼠标滚轮或类似设备时触发,如:mousewheel
文本事件,当在文档中输入文本时触发,如:textInput
键盘事件,当用户通过键盘在页面上执行操作时触发,如:keydownkeypress
合成事件,当为IME(输入法编辑器)输入字符时触发,如:compositionstart
变动事件,当底层 DOM 结构发生变化时触发,如:DOMsubtreeModified

同时 DOM3 级事件也允许使用者自定义一些事件。

DOM事件流

上文中讲到了 addEventListener 的第三个参数为指定事件是否在捕获阶段执行,设置为 true 表示事件在捕获阶段执行,而设置为 false 表示事件在冒泡阶段执行。那么什么是事件冒泡和事件捕获呢?可以用下图来解释:
在这里插入图片描述

1.事件冒泡

所谓事件冒泡就是事件像泡泡一样从最开始生成的地方一层一层往上冒,比如上图中 a 标签为事件目标,点击 a 标签后同时也会触发 pli 上的点击事件,一层一层向上直至最外层的 htmldocument。下面是代码示例:

<div id="box">
    <a id="child">事件冒泡</a>
</div>

<script>
 var box = document.getElementById('box'),
 child = document.getElementById('child');

child.addEventListener('click', function() {
    alert('我是目标事件');
 }, false);

 box.addEventListener('click', function() {
    alert('事件冒泡至DIV');
 }, false);
</script>

上面的代码运行后我们点击 a 标签,首先会弹出’我是目标事件’提示,然后又会弹出’事件冒泡至 DIV 的提示,这便说明了事件自内而外向上冒泡了。

那么我们如何阻止事件冒泡呢?这里就涉及事件的 Event 对象中的 stopPropagation 方法,如下:

child.addEventListener('click', function(e) {
    alert('我是目标事件');
    e.stopPropagation();
}, false);

加上 stopPropagation 方法后,我们再次点击 a 标签就不会触发 div 上的 click 事件了。

2.事件捕获

和事件冒泡相反,事件捕获是自上而下执行,我们只需要将 addEventListener 的第三个参数改为true就行。

<div id="box">
    <a id="child">事件冒泡</a>
</div>

<script>
 var box = document.getElementById('box'),
 child = document.getElementById('child');

 child.addEventListener('click', function() {
     alert('我是目标事件');
 }, true);

 box.addEventListener('click', function() {
    alert('事件冒泡至DIV');
 }, true);
</script>

此时我们点击 a 标签,首先弹出的是’事件冒泡至 DIV,其次弹出的是’我是目标事件’,正好与事件冒泡相反。

# 高校智慧校园解决方案摘要 智慧校园解决方案是针对高校信息化建设的核心工程,旨在通过物联网技术实现数字化校园的智能化升。该方案通过融合计算机技术、网络通信技术、数据库技术和IC卡识别技术,初步实现了校园一卡通系统,进而通过人脸识别技术实现了更精准的校园安全管理、生活管理、教务管理和资源管理。 方案包括多个管理系统:智慧校园管理平台、一卡通卡务管理系统、一卡通人脸库管理平台、智能人脸识别消费管理系统、疫情防控管理系统、人脸识别无感识别管理系统、会议签到管理系统、人脸识别通道管理系统和图书馆对接管理系统。这些系统共同构成了智慧校园的信息化基础,通过统一数据库和操作平台,实现了数据共享和信息一致性。 智能人脸识别消费管理系统通过人脸识别终端,在无需接触的情况下快速完成消费支付过程,提升了校园服务效率。疫情防控管理系统利用热成像测温技术、视频智能分析等手段,实现了对校园人员体温监测和疫情信息实时上报,提高了校园公共卫生事件的预防和控制能力。 会议签到管理系统和人脸识别通道管理系统均基于人脸识别技术,实现了会议的快速签到和图书馆等场所的高效通行管理。与图书馆对接管理系统实现了一卡通系统与图书馆管理系统的无缝集成,提升了图书借阅的便捷性。 总体而言,该智慧校园解决方案通过集成的信息化管理系统,提升了校园管理的智能化水平,优化了校园生活体验,增强了校园安全,并提高了教学和科研的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值