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 getElementsByTagName
Jan 31 Javascript
JQuery文本框高亮显示插件代码
Apr 02 Javascript
什么是json和jsonp,jQuery json实例详详细说明
Dec 11 Javascript
网页右侧悬浮滚动在线qq客服代码示例
Apr 28 Javascript
jQuery学习笔记之jQuery原型属性和方法
Jun 09 Javascript
JavaScript仿商城实现图片广告轮播实例代码
Feb 06 Javascript
原生js实现查询天气小应用
Dec 09 Javascript
基于Require.js使用方法(总结)
Oct 26 Javascript
vue内置指令详解
Apr 03 Javascript
详解webpack的proxyTable无效的解决方案
Jun 15 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
Dec 14 Javascript
详解element-ui中表单验证的三种方式
Sep 18 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代码
2007/03/08 PHP
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
区分JS中的undefined,null,"",0和false
2007/03/08 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
关于javascript function对象那些迷惑分析
2011/10/24 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
jQuery tip提示插件(实例分享)
2017/04/28 jQuery
JQuery Ajax 异步操作之动态添加节点功能
2017/05/24 jQuery
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
Python实现快速多线程ping的方法
2015/07/15 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python hashlib模块用法实例分析
2018/06/12 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
Python面向对象进阶学习
2019/05/21 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
python写一个随机点名软件的实例
2019/11/28 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
食品营养与检测应届生求职信
2013/11/08 职场文书
申论倡议书范文
2014/05/13 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
Vue实现下拉加载更多
2021/05/09 Vue.js
JS封装cavans多种滤镜组件
2022/02/15 Javascript
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript