当前位置:   article > 正文

js给button绑定οnclick点击事件_DOM 事件模型和DOM 事件机制

注入 button onclick

4d70d4ae208c8a8f15f8e65b8365e637.png

事件是用户或者浏览器自己执行的某种动作,是文档或者浏览器发生的一些交互瞬间,比如点击(click)按钮等,这里的click就是事件的名称。JS与html之间的交互是通过事件实现的,DOM支持大量的事件。DOM 事件模型这个知识点,在面试的时候也是常考知识~

事件流

DOM是个树形结构,当我们在页面上单击一个按钮,页面上哪些元素会触发这个事件,是发生在这个按钮上,还是这个按钮的容器元素(我们说父元素)也会触发这个点击事件呢? 这就牵扯到事件流,从上面的思考,我们知道它描述的是事件触发顺序,那上文中是按钮和其容器元素都触发吗,它们谁先触发呢?这可不是确定的,得看是哪种类型的事件流了。

1、事件冒泡

事件冒泡是IE 的事件流,事件是由最具体的元素接收,然后逐级向上传播,在每一级的节点上都会发生,直到传播到document对象,向Chrome这样的浏览器会冒泡到window 对象(很容易记忆,联想水里的泡泡不也这样么)。

2、事件捕获

事件捕获是Netscape浏览器开发团队提出的,很有意思,他们思想和IE 的截然相反。也就是说,从不具体的节点到最具体的节点,一般是从document对象开始传播,不过很少人用事件捕获的,还是事件冒泡用的多。

3、DOM 事件流

这里规定的事件流有三个阶段: 事件捕获阶段,目标阶段,事件冒泡阶段。

代码如下

  1. <div class="爷爷">
  2. <div class="爸爸">
  3. <div class="儿子">
  4. 文本
  5. </div>
  6. </div>
  7. </div>

有这样的一个网页,即 .爷爷>.爸爸>.儿子,分别添加事件监听 fnYe / fnBa / fnEr

提问1: 点击了谁?

点击文字, 算不算点击儿子

点击文字, 算不算点击爸爸

点击文字, 算不算点击爷爷

答: 都算

提问2: 调用顺序? 点击文字最先调用fnYe/fnBa/fnEr中的哪一个函数?

答: 都行. IE5调用顺序为fnEr->fnBa->fnYe, 网景调用顺序为fnYe->fnBa->fnEr

因此W3C在2002年发布了标准, 文件名为DOM Level 2 Events Specification, 规定浏览器同时支持两种调用顺序.首先按爷爷->爸爸->儿子顺序看有没有函数监听, 然后按儿子->爸爸->爷爷顺序看有没有函数监听.

因此, 用专业术语来说这2种顺序分别就是DOM事件模型的事件捕获和事件冒泡.一个事件发生后,会在子元素和父元素之间传播(propagation)。

由外向内找监听函数, 叫事件监听.

由内向外找监听函数, 叫事件冒泡.

其中文字(示例代码中)就是事件监听和事件冒泡的目标.因此DOM事件模型分为3个阶段:

(1)捕获阶段:事件从window对象自上而下向目标节点传播的阶段(示例代码中简化为: 爷爷->爸爸->儿子);

(2)目标阶段:真正的目标节点正在处理事件的阶段;(示例代码中: 文字)

(3)冒泡阶段:事件从目标节点自下而上向window对象传播的阶段(示例代码中简化为: 儿子->爸爸->爷爷)。

  • 事件捕获,是指按 爷爷=>爸爸=>儿子 的顺序看有没有函数监听
  • 事件冒泡,是指按 儿子=>爸爸=>爷爷 的顺序看有没有函数监听

从外向内找监听函数,叫事件捕获从内向外找监听函数,叫事件冒泡

完整DOM事件模型示意图:

3d31b7447de34d434b5dc5d725888d4a.png

事件绑定API:

IE5: baba.attachEvent('onclick', fn)//事件冒泡

网景: baba.addEventListener('click', fn)//事件捕获

W3C: baba.addEventListener('click', fn, bool), 如果bool不传或为falsy, 则fn使用事件冒泡, 反之则fn使用事件捕获.

6980725486127018e5697a044772a140.png

如果bool不传或为falsy就让fn走冒泡,即当浏览器在冒泡阶段发现baba有监听函数 就会

fn 并提供事件信息

如果bool为true就让fn走捕获 即当浏览器在捕获阶段发现baba有监听函数 调用fn 并提供事件信息

DOM事件级别

DOM级别一共可以分为四个级别:DOM0级、DOM1级、DOM2级和DOM3级。而DOM事件分为3个级别:DOM 0级事件处理,DOM 2级事件处理和DOM 3级事件处理。由于DOM 1级中没有事件的相关内容,所以没有DOM 1级事件。

DOM 0级事件

el.οnclick=function(){}

  1. let btn = document.getElementById('btn');
  2. btn.onclick=function(){
  3. alert(this.innerHTML);
  4. }

当希望为同一个元素/标签绑定多个同类型事件的时候(如给上面的这个btn元素绑定3个点击事件),是不被允许的。DOM0事件绑定,给元素的事件行为绑定方法,这些方法都是在当前元素事件行为的冒泡阶段(或者目标阶段)执行的。

DOM 2级事件

el.addEventListener(event-name, callback, useCapture)

event-name: 事件名称,可以是标准的DOM事件

callback: 回调函数,当事件触发时,函数会被注入一个参数为当前的事件对象 event

  1. useCapture: 默认是false,代表事件句柄在冒泡阶段执行
  2. let btn = document.getElementById('btn');
  3. btn.addEventListener("click", test, false);
  4. function test(e){
  5. e = e || window.event;
  6. alert((e.target || e.srcElement).innerHTML);
  7. btn.removeEventListener("click", test)
  8. }
  9. //IE9-:attachEvent()与detachEvent()。
  10. //IE9+/chrom/FF:addEventListener()和removeEventListener()

IE9以下的IE浏览器不支持 addEventListener()和removeEventListener(),使用 attachEvent()与detachEvent() 代替,因为IE9以下是不支持事件捕获的,所以也没有第三个参数,第一个事件名称前要加on。

DOM 3级事件

在DOM 2级事件的基础上添加了更多的事件类型。

UI事件,当用户与页面上的元素交互时触发,如:load、scroll

焦点事件,当元素获得或失去焦点时触发,如:blur、focus

鼠标事件,当用户通过鼠标在页面执行操作时触发如:dblclick、mouseup

滚轮事件,当使用鼠标滚轮或类似设备时触发,如:mousewheel

文本事件,当在文档中输入文本时触发,如:textInput

键盘事件,当用户通过键盘在页面上执行操作时触发,如:keydown、keypress

合成事件,当为IME(输入法编辑器)输入字符时触发,如:compositionstart

变动事件,当底层DOM结构发生变化时触发,如:DOMsubtreeModified

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号