JavaScript的事件机制详解


Posted in Javascript onJanuary 17, 2017

事件是将JavaScript脚本与网页联系在一起的主要方式,是JavaScript中最重要的主题之一,深入理解事件的工作机制以及它们对性能的影响至关重要。本文将详细探讨JavaScript的事件机制,并对比分析了浏览器之间的不同,具体内容包括事件流、事件处理程序绑定方式、事件对象等。

如何理解事件?

JavaScript与HTML之间的交互就是通过事件实现的。

事件:用户或浏览器自身执行的某种动作,换言之,文档或浏览器发生的一些特定的交互瞬间。

事件处理程序:又称事件侦听器,事件发生时执行的代码段。

事件流:事件流描述的是从页面中接收事件的顺序。

两种基本事件模型

事件冒泡:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。

事件捕获:事件从最不精确的对象(document 对象)开始触发,然后到最精确。

IE9、Safari、Chrome、Opera、Firefox都是从window对象开始捕获,冒泡到window对象

JavaScript的事件机制详解

DOM事件流

同时支持 两种基本事件模型,规定事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。

DOM事件处理程序绑定时,程序员可以自己选择绑定事件时采用事件捕获还是事件冒泡。

IE事件流

IE只支持事件冒泡,不支持事件捕获。

事件处理程序绑定方式

DOM事件处理程序

DOM事件处理程序属性名为“on”+事件名,程序作用域为元素的作用域,this指向元素本身。

方法一:将函数值赋给一个事件处理程序属性。如下:

var btn= document.getElementById("myBtn"); 
btn.onclick = function{ //具体代码段 }

注意:此种方法只能添加一个事件处理程序

方法二:通过addEventListener方法。如下:

addEventListener("事件名",事件处理程序,ture/false:在事件捕获/冒泡阶段调用模型)

对应的事件处理程序移除方法:removeEventListener,参数必须相同。

注意:此种方法,以匿名函数添加的事件处理程序无法被移除

此方法可以添加多个事件处理程序

IE事件处理程序

IE+Oprea浏览器

程序作用域为全局作用域,this指向window对象

添加方法:attachEvent("on+事件名",事件处理程序)

移除方法:detachEvent("on+事件名",事件处理程序)

事件对象

在触发某个事件时,会产生一个相应的事件对象,这个对象包含所有与事件相关的信息。如:导致事件的元素、事件的类型等

DOM中的事件对象

对象名:event

常用属性:

type:被触发事件的类型

target:事件的目标

常用方法:

event.preventDefault:取消事件默认行为(前提:cancelable属性值为true)

event.stopPropagation:取消事件的进一步冒泡或捕获

IE中的事件对象

对象名:window.event

常用属性:

type:被触发事件的类型

scrElement:事件的目标

常用方法:

event.cancelBubble(true/false):true->取消事件默认行为
event.returnValue(true/false):false->取消事件的进一步冒泡或捕获

综合以上所述,整理代码写可跨浏览器的事件处理程序(构造EventUtil对象,为其添加可兼容各浏览器的事件处理方法),如下:

/*可跨浏览器的事件处理程序
构造EventUtil对象,为其添加可兼容各浏览器的事件处理方法
*/
var EventUtil = {
  /*添加事件处理程序*/
  addHandler: function (element, type, handler) {
    if (element.addEventListener) {
      addEventListener(type, handler, false);
    } else if (element.attachEvent) {
      attachEvent("on" + type, handler);
    } else {
      element["on" + type] = handler;
    }
  },
  /*移除事件处理程序*/
  removeHandler: function (element, type, handler) {
    if (element.removeEventListener) {
      removeEventListener(type, handler, false);
    } else if (element.detachEvent) {
      detachEvent("on" + type, handler);
    } else {
      element["on" + type] = null;
    }
  },
  /*获得事件对象*/
  getEvent: function (event) {
    return event ? event : window.event;
  },
  /*获得事件的目标*/
  getTarget: function (event) {
    return event.target || event.scrElement;
  },
  /*取消事件的默认行为*/
  preventDefault: function (event) {
    if (event.preventDefault) {
      event.preventDefault;
    } else {
      event.returValue = false;
    }
  },
  /*阻止事件进一步冒泡*/
  stopPropagation: function (event) {
    if (event.stopPropagation) {
      event.stopPropagation;
    } else {
      event.cancelBubble = true;
    }
  }
};

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
javascript 获取元素位置的快速方法 getBoundingClientRect()
Nov 26 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
Jan 13 Javascript
文本域光标操作的jQuery扩展分享
Mar 10 Javascript
提取jquery的ready()方法单独使用示例
Mar 25 Javascript
jQuery定义背景动态切换效果的方法
Mar 23 Javascript
Js的Array数组对象详解
Feb 22 Javascript
JavaScript 数组some()和filter()的用法及区别
May 20 Javascript
Angularjs实现分页和分页算法的示例代码
Dec 23 Javascript
浅谈键盘上回车按钮的js触发事件
Feb 13 Javascript
Jil,高效的json序列化和反序列化库
Feb 15 Javascript
Javascript中绑定click事件的四种方式介绍
Oct 26 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
js判断手机号是否正确并返回的实现代码
Jan 17 #Javascript
深入理解javascript中的 “this”
Jan 17 #Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
Jan 17 #Javascript
Javascript设计模式之装饰者模式详解篇
Jan 17 #Javascript
微信小程序图表插件(wx-charts)实例代码
Jan 17 #Javascript
jQuery图片拖动组件Dropzone用法示例
Jan 17 #Javascript
js生成随机数方法和实例
Jan 17 #Javascript
You might like
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
php连接mysql数据库代码
2009/03/10 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php Rename 更改文件、文件夹名称
2011/05/24 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
jQuery绑定事件不执行但alert后可以正常执行
2014/06/03 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
jQuery插件实现静态HTML验证码校验
2015/11/06 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
vue-cli V3.0版本的使用详解
2018/10/24 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
pyenv命令管理多个Python版本
2017/03/26 Python
python实现简易动态时钟
2018/11/19 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
python-地图可视化组件folium的操作
2020/12/14 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
高级3D打印市场:Gambody
2019/12/26 全球购物
测试时代收集的软件测试面试题
2013/09/25 面试题
高中军训感言800字
2014/03/05 职场文书
初中新生军训方案
2014/05/13 职场文书
教师节学生演讲稿
2014/09/03 职场文书
停车位租赁协议书
2014/09/24 职场文书
排球赛新闻稿
2015/07/17 职场文书
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS
oracle数据库去除重复数据
2022/05/20 Oracle
Mysql数据库group by原理详解
2022/07/07 MySQL