《JS高程》事件学习笔记


- 这意味着在捕获阶段,事件从 document 到 <html> 再到 <body> 后就停止了。
- 下一阶段是“处于目标”阶段,于是事件在 <div> 上发生,并在事件处理中被看成冒泡阶段的一部分。
- 然后,冒泡阶段发生,事件又传播回文档。
| 优点 |
(1)有权访问全局作用域中的任何代码;
(2)会封装着元素属性值的函数,这个函数中有局部变量 event,即事件对象;
(3)在这个函数内部,this 值等于事件的目标元素; (4)扩展作用域。在这个函数内部,可以像访问局部变量一样访问 document 及该元素本身的成员;可以让事件处理程序无需引用表单元素就能访问其他表单字段。 |
|
缺点
|
(1)存在时差问题;
(2)这样扩展事件处理程序的作用域链在不同浏览器中会导致不同结果;
(3)HTML 与 JavaScript 代码紧密耦合。
|
|
删除事件处理程序
|
将相应的属性设置为 nul
|
|
方法
|
(1)首先,必须取得一个要操作的对象的引用;
(2)将一个函数赋值给一个事件处理程序属性
|
|
缺点
|
对每个事件只支持一个事件处理程序
|
|
删除事件处理程序
|
将事件处理程序属性设置为 null
|
|
事件处理阶段
|
在事件流的冒泡阶段被处理
|
var btn = document.getElementById("myBtn");
btn.onclick = function() {
alert(this.id); // "myBtn"
};
btn.onclick = null; // 删除事件处理程序
|
方法
|
(1)指定事件处理程序:addEventListener()
(2)删除事件处理程序:removeEventListener()
|
|
方法的参数
|
要处理的事件名
作为事件处理程序的函数
布尔值(true 表示捕获阶段调用事件处理程序,false 表示冒泡阶段调用事件处理程序)
|
|
好处
|
可以添加多个事件处理程序
|
| 移除事件处理程序 |
只能通过 removeEventListener() 来移除;
移除时传入的参数与添加处理程序时使用的参数相同,使用匿名函数无法移除。
|
|
事件处理阶段
|
大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段;
如果不是特别需要,不建议在事件捕获阶段注册事件处理程序。
|
var btn = document.getElementById("myBtn");
var handler = function() {
alert(this.id);
};
btn.addEventListener("click", handler, false);
btn.removeEventListener("click", handler, false); // 删除事件处理程序
| 方法 |
(1)attachEvent()
(2)detachEvent()
|
|
方法的参数
|
事件处理程序名称、事件处理程序函数
|
|
好处
|
可以添加多个事件处理程序,同 addEventListener()
|
|
移除事件处理程序
|
通过 detachEvent() 来移除,必须提供相同的参数,同 DOM 方法
|
|
与 DOM0 级方法区别
|
主要区别在于事件处理程序的作用域:
DOM0 级方法:事件处理程序会在其所属元素的作用域内运行;
attachEvent() 方法:事件处理程序会在全局作用域中运行,因此 this 等于 window。
|
var btn = document.getElementById("myBtn");
btn.attachEvent("onclick", function() {
alert(this === window); // true
});
|
对象
|
EventUtil(用于处理浏览器间的差异)
|
| 方法 |
addHandler():视情况分别使用 DOM0 级方法、DOM2 级方法或 IE 方法来添加事件
removeHandler():移除添加的事件处理程序
|
| 参数 |
要操作的元素、事件名称、事件处理程序函数
|
| 缺点 |
没有考虑到所有的浏览器问题,例如在 IE 中的作用域问题。
不过,使用它们添加和移除事件处理程序还是足够了。
|
// 定义EventUtil对象
var EventUtil = { addHandler: function(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(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;
}
}
} // 使用EventUtil对象
var btn = document.getElementById("myBtn");
var handler = function() {
alert("Clicked");
} EventUtil.addHandler(btn, "click", handler);
EventUtil.removeHandler(btn, "click", handler);
EventUtil对象方法定义及用法
var btn = document.getElementById("myBtn");
btn.onclick = function(event) {
alert(event.type); // "click"
}
btn.addEventListener("click", function(event){
alert(event.type); // "click"
}, false);
在通过 HTML 特性指定事件处理程序时,变量 event 中保存着 event 对象。
<input type="button" value="Click Me" onclick="alert(event.type)" />
|
属性/方法
|
类型
|
读/写
|
说明
|
|
bubbles
|
Boolean
|
只读
|
表明事件是否冒泡
|
|
cancelable
|
Boolean
|
只读
|
表明是否可以取消事件的默认行为
|
|
currentTarget
|
Element
|
只读
|
其事件处理程序当前正在处理事件的那个元素
|
|
defaultPrevented
|
Boolean
|
只读
|
为 true 表示已经调用了 preventDefault() (DOM3 级事件中新增)
|
|
detail
|
Integer
|
只读
|
与事件相关的细节信息
|
|
eventPhase
|
Integer
|
只读
|
调用事件处理程序的阶段:1 表示捕获阶段,2 表示“处于目标,3 表示冒泡阶段
|
|
preventDefault()
|
Function
|
只读 |
取消事件的默认行为。如果 cancelable 是 true,则可以使用该方法
|
|
stopImmediatePropagation()
|
Function
|
只读
|
取消事件的进一步捕获或冒泡,同时阻止任何事件处理程序被调用(DOM3 级事件中新增)
|
|
stopPropagation()
|
Function
|
只读
|
取消事件的进一步捕获或冒泡。如果 bubbles 为 true,则可以使用该方法
|
|
target
|
Element
|
只读
|
事件的目标
|
|
trusted
|
Boolean
|
只读
|
为 true 表示事件是浏览器生成的。为 false 表示事件由开发人员通过 JavaScript 创建的(DOM3 级事件中新增)
|
|
type
|
String
|
只读
|
被触发的事件的类型,需要通过一个函数处理多个事件时使用
|
|
view
|
AbstractView
|
只读
|
与事件关联的抽象视图。等同于发生事件的 window 对象
|
- 在使用 DOM0 级方法添加事件处理程序时,event 对象作为 window 对象的一个属性存在(window.event)。
btn.onclick = function() {
var event = window.event;
alert(event.type); // "click"
};
- 如果事件处理程序是使用 attachEvent() 添加的,event 对象会作为参数被传入事件处理程序中。也可通过 window 对象来访问 event 对象,同 DOM0 级方法。
btn.attachEvent("onclick", function(event) {
alert(event.type); // "click"
});
- 如果是通过 HTML 特性指定的事件处理程序,可以通过一个名叫 event 的变量来访问 event 对象。
|
属性/方法
|
类型
|
读/写
|
说明
|
|
cancleBubble
|
Boolean
|
读/写
|
默认值为 false,但将其设置为 true 就可以取消事件冒泡
(同 DOM 中的 stopPropagation() 方法)
|
|
returnValue
|
Boolean
|
读/写
|
默认值为 true,但将其设置为 false 就可以取消事件的默认行为
(同 DOM 中的 preventDefault() 方法)
|
|
srcElement
|
Element
|
只读
|
事件的目标(同 DOM 中的 target 属性)
|
|
type
|
String
|
只读
|
被触发的事件的类型
|
|
对象
|
EventUtil(用于处理浏览器间的差异)
|
| 方法 | getEvent():返回对 event 对象的引用 getTarget():返回事件的目标 preventDefault():用于取消事件的默认行为 stopPropagation():阻止事件流 |
// 定义EventUtil对象
var EventUtil = { addHandler: function(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;
}
}, getEvent: function(event) {
return event ? event : window.event;
}, getTarget: function(event) {
return event.targete || event.srcElement;
}, preventDefault: function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.retrunValue = false;
}
}, removeHandler: function(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;
}
}, stopPropagation: function(event) {
if (event.stopPropagation) {
event.stopPropagation();
} else {
event.cancleBubble = true;
}
}
} // 使用EventUtil对象
var btn = document.getElementById("myBtn");
var handler = function() {
alert("Clicked");
} EventUtil.addHandler(btn, "click", handler); btn.onclick = function(event) {
event.EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
EventUtil.preventDefault(event);
EventUtil.stopPropagation(event);
} EventUtil.removeHandler(btn, "click", handler);
EventUtil对象方法定义及用法
- document对象很快就可以访问到,而且可以在页面生命周期的任何时点为上为它添加事件处理程序(无需等待 DOMContentLoaded 或 load 事件)
- 在页面中设置事件处理程序所需的时间更少
- 整个页面占用的内存空间更少,能够提升整体性能
- 使用 removeChild()、replaceChild() 或 innerHTML 等 DOM 操作删除元素;——>手工移除事件处理程序
- 卸载页面的时候。——>在卸载页面之前,先通过 onunload 事件处理程序移除所有事件处理程序
- 如果事先知道将来有可能使用 innerHTML 替换掉页面中的一部分,那么就可以不直接把事件处理程序添加到该部分的元素中。而通过把事件处理程序指定给较高层次的元素,同样能够处理该区域中的事件。
- 需要跟踪的事件处理程序越少,移除它们就越容易
参考博文:
《JS高程》事件学习笔记的更多相关文章
- js的事件学习笔记
目录 0.参考 1.事件流 冒泡传播 事件捕获 2.事件绑定--onclick接口 onclick类的接口,只能注册一个同类事件 onclick类的接口,使用button.onclick = null ...
- 浏览器中js执行机制学习笔记
浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...
- 纯JS实现KeyboardNav(学习笔记)一
纯JS实现KeyboardNav(学习笔记)一 这篇博客只是自己的学习笔记,供日后复习所用,没有经过精心排版,也没有按逻辑编写 GitHub项目源码 预览地址 最终效果 KeyboardNav使用指南 ...
- 纯JS实现KeyboardNav(学习笔记)二
纯JS实现KeyboardNav(学习笔记)二 这篇博客只是自己的学习笔记,供日后复习所用,没有经过精心排版,也没有按逻辑编写 这篇主要是添加css,优化js编写逻辑和代码排版 GitHub项目源码 ...
- 【09-23】js原型继承学习笔记
js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...
- Underscore.js 源码学习笔记(下)
上接 Underscore.js 源码学习笔记(上) === 756 行开始 函数部分. var executeBound = function(sourceFunc, boundFunc, cont ...
- Underscore.js 源码学习笔记(上)
版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}()); 这样的东西,我们应该知道这是一个 IIFE(立即执行 ...
- C#委托与事件学习笔记
委托事件学习笔记 本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行.在实际开发中最常用的就是使一个方法可以当做一个参数 ...
- [360前端星计划]BlackJack(21点)(纯JS,附总部学习笔记)
[360前端星计划]总部学习笔记(6/6) [360前端星计划]详情跳转 游戏界面预览 目录 一.游戏介绍 1.起源 2.规则 3.技巧 二.游戏设计 1.整体UI构思 2.素材采集 3.游戏总规划 ...
随机推荐
- C++调用父类的构造函数规则
构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法).因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需 ...
- 一些git命令
git push --set-upstream origin release 强制将add的数据提交到 release分支.
- Octopus系列之关于多选属性如何在OO中表示呢?
在电子商务系统中 关于产品属性的问题 会设计如下几个表 产品信息 Product 选项信息表 Option 存储 Size Color.... 选项值信息表 O ...
- C#入门篇6-9:字符串操作 不值一提的函数【不看也行】
// 判断输入的是否全是数字:返回结果:true:全是数字:false:有字幕出现 public static bool Isaccord1(string str) { bool bl = true; ...
- hduacm 5255
http://acm.hdu.edu.cn/showproblem.php?pid=5255 枚举a和c 求解b #include <cstdio> #include <cstri ...
- Microsoft Mole原理及常见问题整理
Moles与Moq(Rhino.Mocks)比较 作用范围 Moq与Rhino.Mocks这类的Mock是对Interface或AbstractClass做Mock, 而Moles是Mock整个 ...
- AbstractMap学习记录
package java.util;import java.util.Map.Entry; /** * This class provides a skeletal implementation of ...
- main函数参数的使用
int main(int argc, char * argv[]) argc: argument count argv:argument vector 其中, char * argv[] 指针数组 c ...
- Installing Cygwin and Starting the SSH Daemon
This chapter explains how to install Cygwin and start the SSH daemon on Microsoft Windows hosts. Thi ...
- 记录一些容易忘记的属性 -- UIImageView
UIImage *image = [UIImage imageNamed:@"back2.jpg"]; //创建一个图片对象,这个方法如果图片名称相同,不管我们调用多少次,得到的 ...