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 相关文章推荐
获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[
Dec 22 Javascript
比较简单的异步加载JS文件的代码
Jul 18 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
JavaScript的递归之递归与循环示例介绍
Aug 05 Javascript
浅谈EasyUI中Treegrid节点的删除
Mar 01 Javascript
vue 2.0封装model组件的方法
Aug 03 Javascript
javaScript手机号码校验工具类PhoneUtils详解
Dec 08 Javascript
一文搞懂ES6中的Map和Set
May 20 Javascript
浅谈Layui的eleTree树式选择器使用方法
Sep 25 Javascript
深入浅析JavaScript中的in关键字和for-in循环
Apr 20 Javascript
js+css3实现炫酷时钟
Aug 18 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
Aug 26 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
基于PHP异步执行的常用方式详解
2013/06/03 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
vue element项目引入icon图标的方法
2018/06/06 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
Python中的并发编程实例
2014/07/07 Python
Python中map和列表推导效率比较实例分析
2015/06/17 Python
Python写的一个简单监控系统
2015/06/19 Python
3分钟学会一个Python小技巧
2018/11/23 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
使用python计算三角形的斜边例子
2020/04/15 Python
资深地理教师自我评价
2013/09/21 职场文书
药学专业毕业生求职信
2013/10/20 职场文书
先进员工获奖感言
2014/08/14 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
责任书格式
2019/04/18 职场文书
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
2021/05/17 Python
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技