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 相关文章推荐
用JS判别浏览器种类以及IE版本的几种方法小结
Aug 02 Javascript
js 实现日期灵活格式化的小例子
Jul 14 Javascript
获取非最后一列td值并将title设为该值的方法
Oct 30 Javascript
JavaScript中判断函数、变量是否存在
Jun 10 Javascript
浅谈JavaScript异常处理语句
Jun 26 Javascript
javascript实现文字无缝滚动
Dec 27 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
May 31 Javascript
ReactJs设置css样式的方法
Jun 08 Javascript
微信小程序时间控件picker view使用详解
Dec 28 Javascript
移动端手指操控左右滑动的菜单
Sep 08 Javascript
JS数组方法some、every和find的使用详情
Oct 05 Javascript
详解Vue slot插槽
Nov 20 Vue.js
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
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
PHP 第二节 数据类型之数值型
2012/04/28 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
php的ajax简单实例
2014/02/27 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
JavaScript实现同时调用多个函数的方法
2015/11/09 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
Vuejs第七篇之Vuejs过渡动画案例全面解析
2016/09/05 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
js 实现复选框只能选择一项的示例代码
2018/01/23 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
PHP统计代码行数的小代码
2019/09/19 Python
Python JSON编解码方式原理详解
2020/01/20 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
村优秀党员事迹材料
2014/01/15 职场文书
解除合同协议书
2014/04/17 职场文书
残疾人小组计划书
2014/04/27 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
学校端午节活动方案
2014/08/23 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
2015高考寄语集锦
2015/02/27 职场文书
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技