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 parseInt与Number函数的区别
Jan 21 Javascript
JavaScript经典效果集锦
Jul 06 Javascript
纯javascript实现简单下拉刷新功能
Mar 13 Javascript
页面内容排序插件jSort使用方法
Oct 10 Javascript
JavaScript判断对象是否为数组
Dec 22 Javascript
Javascript基础学习笔记(菜鸟必看篇)
Jul 22 Javascript
JS验证字符串功能
Feb 22 Javascript
详解用Node.js实现Restful风格webservice
Sep 29 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
关于layui表单中按钮自动提交的解决方法
Sep 09 Javascript
原生JS实现记忆翻牌游戏
Jul 31 Javascript
vue组件中实现嵌套子组件案例
Aug 31 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
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
PHP调用MySQL的存储过程的实现代码
2008/08/12 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
WordPress中"无法将上传的文件移动至"错误的解决方法
2015/07/01 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
javascript定义函数的方法
2010/12/06 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
Angular 容器部署的方法
2018/04/17 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
Python实现查找匹配项作处理后再替换回去的方法
2017/06/10 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
美国市场上最实惠的送餐服务:Dinnerly
2018/03/18 全球购物
应聘医药代表职位求职信
2013/10/21 职场文书
网上书店创业计划书
2014/01/12 职场文书
办公室副主任职责范本
2014/03/08 职场文书
迎新晚会主持词
2014/03/24 职场文书
战友聚会主持词
2014/04/02 职场文书
社区平安建设方案
2014/05/25 职场文书
科学发展观活动总结
2014/08/28 职场文书
调解协议书范本
2016/03/21 职场文书
python树莓派通过队列实现进程交互的程序分析
2021/07/04 Python
win10更新失败无限重启解决方法
2022/04/19 数码科技