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 相关文章推荐
从零开始学习jQuery (三) 管理jQuery包装集
Feb 23 Javascript
jquery 操作日期、星期、元素的追加的实现代码
Feb 07 Javascript
javascript的数组和常用函数详解
May 09 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
Jun 09 Javascript
jQuery中removeData()方法用法实例
Dec 27 Javascript
简单的jQuery入门指引
Jul 28 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
Jan 09 Javascript
js倒计时显示实例
Dec 11 Javascript
vue addRoutes实现动态权限路由菜单的示例
May 15 Javascript
如何为vuex实现带参数的 getter和state.commit
Jan 04 Javascript
layui内置模块layim发送图片添加加载动画的方法
Sep 23 Javascript
Vue图片裁剪组件实例代码
Jul 02 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
无数据库的详细域名查询程序PHP版(3)
2006/10/09 PHP
phpMyAdmin 安装及问题总结
2009/05/28 PHP
PHP Socket 编程
2010/04/09 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
javascript OFFICE控件测试代码
2009/12/08 Javascript
菜鸟javascript基础整理1
2010/12/06 Javascript
JS关键字变色实现思路及代码
2013/02/21 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
Javascript基础知识盲点总结之函数
2016/05/15 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
理解Python中的绝对路径和相对路径
2017/08/30 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
简单了解Python3里的一些新特性
2019/07/13 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
CLR与IL分别是什么含义
2016/08/23 面试题
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
施工安全协议书
2016/03/22 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
实习报告范文
2019/07/30 职场文书