DOM事件对象用法
分为三个阶段:事件捕获阶段、目标阶段、事件冒泡阶段。
事件捕获老版本浏览器(IE<=8)不支持,但是事件冒泡可以放心使用。

事件处理程序
一共四类写法,基本都见过,看下写法就知道怎么回事儿了。
1. HTML事件处理程序
<input type="button" value="Click me" onclick="ShowMessage()"/>
2. DOM0级事件处理程序
var btn = document.getElementById("myBtn");
btn.onclick = function(){
alert("click!");
alert(this.id);//this指向myBtn,可继续获取myBtn的其余属性
}
3. DOM2级事件处理程序
定义事件及删除事件的两个方法:addEventListener、removeEventListener。
var btn = document.getElementById("myBtn");
btn.addEventListener("click",function(){
alert(this.id);
},false);
第三个参数:true,表示在捕获阶段触发;false,表示程序在冒泡阶段触发;
removeEventListener()的第二个参数必须传入与addEventListener()中相同的处理函数(传入相同的函数引用,而不是形同函数!),否则不会生效。
var handler = function handler(){
alert(this.id);
}
btn.addEventListener("click", handler, false);
btn.removeEventListener("click", handler, false);
4. IE事件处理函数
IE就是这么另类(IE8及更早版本)
定义事件及删除事件的两个方法:attachEvent、detachEvent。因为只支持冒泡,故第三个参数没有;且第一个参数需要带上“on”!
var handler = function handler(){
alert(this.id);
}
btn.attachEvent("onclick", handler);
btn.detachEvent("onclick", handler);
事件对象
事件触发会在handler中传入事件对象event。
1. DOM中的事件对象
event的成员属性及说明如下,以下属性皆为只读:
| 属性/方法 | 说明 | 示例 |
|---|---|---|
| bubble | 表示事件是否冒泡 | event.bubble -> true/false |
| cancelable | 是否可以取消事件的默认行为 | event.cancelable -> true/false |
| currentTarget | 事件函数正在处理事件的那个元素,比如委托document处理 | |
| defaultPrevented | 为true则表示已经调用了 preventDefault() | |
| eventPhase | 事件处理阶段,1捕获阶段,2目标,3冒泡阶段 | event.eventPhase === 1 |
| preventDefault() | 取消默认行为 | event. preventDefault(); |
| stopPropagation() | 取消进一步冒泡捕获行为 | event.stopPropagation(); |
| stopImmediatePropagation() | 取消进一步冒泡捕获行为,并阻止任何事件处理程序被调用 | event.stopImmediatePropagation(); |
| target | 设计目标 | event.target === getElementById(id) |
| type | 触发事件的类型 | event.type === 'click' |
2. IE中事件对象
因为IE中没有捕获,故简单了些。注意对比两个表的区别!
| 属性/方法 | 说明 | 示例 |
|---|---|---|
| returnValue | 取消默认行为 | event. returnValue = false; //取消默认行为 |
| cancelBubble | 取消进一步冒泡捕获行为 | event.cancelBubble = true;//取消冒泡 |
| srcElement | 设计目标 | event.srcElement === getElementById(id) |
| type | 触发事件的类型 | event.type === 'click' |
3. 跨浏览器兼容方案
为了保证大多数浏览器的兼容,故只需要考虑冒泡阶段的实现。上面说的很清楚了,这里直接上代码。
var EventUtil = {
// 绑定事件
addHandler: function addHandler(element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + type, handler);
} else {
element['on' + type] = handler;
}
},
// 解绑事件
removeHandler: function removeHandler(element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.detachEvent) {
element.detachEvent('on' + type, handler);
} else {
element['on' + type] = null;
}
},
// 获取事件对象event
getEvent: function getEvent(event) {
return event || window.event;
},
// 获取触发目标
getTarget: function getTarget(event) {
return event.target || event.srcElement;
},
// 阻止默认行为
preventDefault: function preventDefault(event) {
if (event.preventDefault) {
event.preventDefault()
} else {
event.returnValue = false;
}
},
// 取消冒泡
stopPropagation: function stopPropagation(event) {
if (event.stopPropagation) {
event.stopPropagation()
} else {
event.cancelBubble = true;
}
}
}
事件的代理/委托的原理以及优缺点
这是靠事件的冒泡机制来实现的,优点是
1、可以大量节省内存占用,减少事件注册,比如在table上代理所有td的click事件就非常棒
2、可以实现当新增子对象时无需再次对其绑定事件,对于动态内容部分尤为合适
手写原生js【实现事件代理】,并要求兼容浏览器
考核对事件对象event的了解程度,以及在IE下对应的属性名。其实此时如果你说就是用target/currentTarget,以及IE下的srcElement/this,基本就可以略过了
绑到按钮上:
var btn = document.getElementById("myBtn");
btn.addEventListener("click",function(){
console.log(event.currentTarget === this);//true
console.log(event.target === this);//true
},false);
绑到document上:
var btn = document.getElementById("myBtn");
document.body.onclick = function(){
console.log(event.currentTarget === this );//true
console.log(document.body === this );//true
console.log(event.target === btn);//true
}
实现事件模型
一个bind一个trigger,分别实现绑定事件和触发事件,核心需求就是可以对某一个事件名称绑定多个事件响应函数,然后触发这个事件名称时,依次按绑定顺序触发相应的响应函数。
大致实现思路就是创建一个类或是匿名函数,在bind和trigger函数外层作用域创建一个字典对象,用于存储注册的事件及响应函数列表,bind时,如果字典没有则创建一个,key是事件名称,value是数组,里面放着当前注册的响应函数,如果字段中有,那么就直接push到数组即可。trigger时调出来依次触发事件响应函数即可。
事件如何派发也就是事件广播(dispatchEvent)
这个是自定义事件及事件触发的应用(createEvent/dispatchEvent, createEventObject/fireEvent)
一般我们在元素上绑定事件后,是靠用户在这些元素上的鼠标行为来捕获或者触发事件的,或者自带的浏览器行为事件,比如click,mouseover,load等等,有些时候我们需要自定义事件或者在特定的情况下需要触发这些事件。这个时候我们可以使用IE下fireEvent方法,高级浏览器(chrome,firefox等)有dispatchEvent方法。
DOM事件对象用法的更多相关文章
- HTML DOM 事件对象
HTML DOM 事件对象 由 youj 创建,小路依依 最后一次修改 2016-08-04 HTML DOM 事件 HTML DOM 事件 HTML DOM 事件允许Javascript在HTML文 ...
- DOM事件对象
触发DOM上的事件时会产生一个事件对象event. event的内容:与事件有关的信息,导致事件的元素,事件的类型及其他与特定事件相关的信息. event对象会传入到事件处理程序中. 一.DOM 中的 ...
- JS HTML DOM 事件对象(onclick、onmouseenter)
HTML DOM 事件允许Javascript在HTML文档元素中注册不同事件处理程序. 事件通常与函数结合使用,函数不会在事件发生前被执行! (如用户点击按钮). HTML DOM 事件 DOM: ...
- jquery之event与originalEvent的关系、event事件对象用法浅析
在jquery中,最终传入事件处理程序的 event 其实已经被 jQuery 做过标准化处理, 其原有的事件对象则被保存于 event 对象的 originalEvent 属性之中, 每个 even ...
- JavaScript DOM事件对象的两个小练习 | 学习内容分享
Event 对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! 本文用于记录个人学习过程 ...
- HTML DOM 事件对象 ondragend 事件
学习网站:http://www.runoob.com/jsref/event-ondragend.html 定义和用法 ondragend 事件在用户完成元素或首选文本的拖动时触发. 拖放是 HTML ...
- JQuery中DOM事件合成用法
jQuery有两个合成事件——hover()方法和toggle()方法 类似前面讲过的ready()方法,hover()方法和toggle()方法都属于jQuery自定义的方法. hover()方法: ...
- 深入学习jQuery事件对象
× 目录 [1]获取 [2]事件类型 [3]事件目标[4]当前元素[5]事件冒泡[6]默认行为[7]命名空间[8]返回值[9]键值 前面的话 在触发DOM上的某个事件时,会产生一个事件对象event, ...
- JavaScript中的事件对象
JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...
随机推荐
- Vue3(三)CND + ES6的import + 工程化的目录结构 = 啥?
突发奇想 这几天整理了一下vue的几种使用方式,对比之后发现有很多相似之处,那么是不是可以混合使用呢?比如这样: vue的全家桶和UI库,采用传统的方式加载(CND.script). 自己写的js代码 ...
- vagrant虚拟化之多网卡网络配置
vagrant虚拟化之多网卡网络配置 一.network改为public 二.查看本地主机网络的ip地址范围(最佳解决方案) 三.vagrant优秀博文 vagrant虚拟化之多网卡网络配置,通过am ...
- Redis 实战 —— 13. 扩展 Redis
简介 当数据量增大或者读写请求增多后,一台 Redis 服务器可能没办法再存储所有数据或者处理所有读写请求,那么就需要对 Redis 进行扩展,保证 Redis 在能存储所有数据对情况下,同时能正常处 ...
- 彻底搞懂Cookie、Session、Token到底是什么
洛:大爷,楼上322住的是马冬梅家吧? 大爷:马都什么? 夏洛:马冬梅. 大爷:什么都没啊? 夏洛:马冬梅啊. 大爷:马什么没? 夏洛:行,大爷你先凉快着吧. 在了解这三个概念之前我们先要了解HTTP ...
- Java线程 - sleep()和wait()方法的区别, 线程阻塞BLOCKED和等待WAITING的区别
一. sleep()和wait()方法的区别 sleep()方法 sleep()方法是Thread类的方法,通过其定义可知是个native方法,在指定的时间内阻塞线程的执行.而且从其注释中可知,并不会 ...
- 爬虫入门到放弃系列02:html网页如何解析
前言 上一篇文章讲了爬虫的概念,本篇文章主要来讲述一下如何来解析爬虫请求的网页内容. 一个简单的爬虫程序主要分为两个部分,请求部分和解析部分.请求部分基本一行代码就可以搞定,所以主要来讲述一下解析部分 ...
- 2019牛客暑期多校训练营(第五场)I.three points 1(暴力几何)
题意:现在给你一个矩形边框 一个三角形的三边长 现在问你能否把三角形放入矩阵边框中 并且输出三个点的坐标 思路:我们可以发现如果一定有解 我们就可以让一个点在左下角(0,0)处 还有一个点在矩形边上 ...
- 2020牛客暑期多校训练营(第二场)Fake Maxpooling
传送门:Fake Maxpooling 题意:给出矩阵的行数n和列数m,矩阵 Aij = lcm( i , j ) ,求每个大小为k*k的子矩阵的最大值的和. 题解:如果暴力求解肯定会t,所以要智取 ...
- 2019牛客多校 Round5
Solved:4 Rank:122 补题:8/10 A digits 2 签到 把这个数写n遍 #include <bits/stdc++.h> using namespace std; ...
- HDU 6852 Increasing and Decreasing 构造
题意: 给你一个n,x,y.你需要找出来一个长度为n的序列,使得这个序列满足最长上升子序列长度为x,最长下降子序列长度为y.且这个序列中每个数字只能出现一次 且要保证最后输出的序列的字典序最小 题解: ...