事件冒泡

事件冒泡即事件开始时由最具体的元素(最”近”的节点)接收,然后逐级向上传播到较为不具体的节点(文档)。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Click</title>
  5. </head>
  6. <body>
  7. <div id="myDiv">Click Me</div>
  8. </body>
  9. </html>

以上 HTML 页面中,当点击<div>元素时,click 事件的传递顺序是这样的: div -> body -> html -> document。所有现代浏览器都支持事件冒泡,但具体实现上有差异。

事件捕获

事件捕获的思想是事件开始时由最不具体的元素(最”远”的节点)接收,最具体的元素最后接收到事件。

以之前的 HTML 代码为例,click 事件的传递顺序是这样的: document -> html -> body -> div。老版本的浏览器不支持事件捕获,所以不推荐使用事件捕获。

事件处理程序(事件句柄)

事件的名字包括 click、load 和 mouseover 等,而响应某个事件的函数叫做事件处理程序(或事件侦听器、事件句柄),事件处理程序的名字以”on”开头,为事件指定处理程序的方式有多种。

HTML事件处理程序

给 HTML 元素添加与事件处理程序同名的 HTML 属性可以指定元素事件。

HTML 代码:

  1. <input type="button" value="click" onclick="clickhandle()" />

JavaScript 代码:

  1. function clickHandle() {
  2. alert("Hello");
  3. }

以上代码在点击按钮时会弹出一个弹窗。

DOM0级事件处理程序

DOM0 级事件处理程序是给元素节点的事件处理程序属性赋一个函数。所有现代浏览器都支持 DOM0 级事件处理程序。

HTML 代码:

  1. <input id="btn" type="button" value="click" />

JavaScript 代码:

  1. var btn = document.getElementById("btn");
  2. btn.onclick = function() {
  3. alert(this.value);
  4. }

事件处理程序中,this 对象引用的是绑定事件处理程序的元素节点,所以以上代码中,当点击按钮时将弹出按钮的 value 属性值。

删除事件处理程序的方法:

  1. btn.onclick = null;

DOM2级事件处理程序

DOM2 级事件给元素节点定义了addEventListener()removeEventListener()方法,分别用于绑定事件处理程序和删除事件处理程序。这两个方法都接收3个参数:要处理的事件名、作为事件处理程序的绑定函数和一个可选布尔值(默认为 false,通常不需要手动设置),第三个布尔值为 true 表示在捕获阶段调用事件处理程序,为 false 表示冒泡阶段调用事件处理程序。

IE9 以上及其他流行的浏览器都支持 DOM2 级事件处理程序。

HTML 代码:

  1. <input id="btn" type="button" value="click" />

JavaScript 代码:

  1. var btn = document.getElementById("btn");
  2. function clickHandle() {
  3. alert(this.value);
  4. }
  5. btn.addEventListener("click", clickHandle);
  6. // 5秒后点击按钮将不会有任何反应
  7. setTimeout(function() {
  8. console.log("Stop");
  9. btn.removeEventListener("click", clickHandle);
  10. }, 5000);

注意,removeEventListener()第二个参数为具体的事件处理程序函数名,如果需要删除指定事件处理程序,则应先将该事件处理程序定义为普通函数而不是直接使用匿名函数。

事件对象

触发一个事件时,会产生一个事件对象,这个事件对象中包含所有与事件有关的信息。

在事件处理程序中可以访问这个事件对象。

  1. var btn = document.getElementById("btn");
  2. btn.onclick = function(event) {
  3. alert(event.type); // 输出事件类型: "click"
  4. }

事件对象常用的属性及方法:

  1. e.target:只读,返回事件的目标(直接触发的元素节点);
  2. e.type:只读,返回事件类型;
  3. e.preventDefault():取消事件的默认行为,常用场景有取消提交按钮的点击提交行为及阻止链接点击跳转等,等同于return false
  4. e.stopPropagation():取消事件进一步捕获或冒泡。

事件类型

UI事件

UI 事件指那些不一定与用户操作有关的事件。

常用的 UI 事件有:

  1. load:页面、图像、脚本等资源完全加载后触发的事件,应用场景:图片加载完全前加入载入一个预备显示图片;
  2. select:用户选择文本框;
  3. scroll:滚动带滚动条的元素时触发,应用场景: 返回顶部按钮。

鼠标事件

鼠标事件是最常用的一类事件。

常用的鼠标事件:

  1. click:单击鼠标左键或按回车键触发;
  2. dblclick:双击鼠标触发;
  3. mousedown:用户按下任意鼠标键时触发;
  4. mouseenter:鼠标移入元素触发;
  5. mouseleave:鼠标移出元素触发;
  6. mousemove:鼠标在元素上移动时触发。

鼠标事件触发元素的事件对象上设置有两个表示客户区(页面显示的区域)坐标的属性:clientX 属性(相对左上角点的水平坐标)和 clientY 属性(相对左上角点的竖直坐标)。

键盘事件

用户使用键盘时会触发键盘事件。

常用的键盘事件:

  1. keydown:按下任意键时触发,按住不放会重复触发;
  2. keypress:按下字符键时触发,按住不放会重复触发;
  3. keyup:释放按键时触发。

键盘事件触发元素的事件对象上设置有 keyCode 属性,用于返回按下的键对应的键码。对于 130事件,触发元素事件对象上的 charCode 属性可以返回按下的字符键对应的 ASCII 码。

自定义事件

  1. var dom = document.getElementById('el');
  2. // 注册事件,不可以添加参数
  3. var eve1 = new Event("myClick")
  4. // 可以添加参数
  5. var eve2 = new CustomEvent('myClick',params)
  6. // 监听事件
  7. dom.addEventListener("myClick",function () {
  8. console.log("myClick");
  9. });
  10. // 触发事件
  11. dom.dispatchEvent(eve1);