本篇主要介绍HTML元素事件的注册、注销的方式。

其他事件文章

1. HTML 事件(一) 事件的介绍

2. HTML 事件(二) 事件的注册与注销

3. HTML 事件(三) 事件流、事件委托

4. HTML 事件(四) 模拟事件操作

目录

1. 注册事件:介绍通过元素的事件属性、addEventListener()以及attachEvent()方法进行事件的注册。

2. 注销事件:介绍通过removeEventListener()、detachEvent()以及事件属性赋值为null来进行事件的注销。

1. 注册事件

注册事件的方式其实有2种:一种属性注册,另一种通过方法注册

属性注册方式又可分为在HTML元素内的事件属性赋值和通过JS指定元素对象的事件属性。

方法注册方式可通过addEventListener()或attachEvent()方法进行事件的注册。

1.1 设置HTML元素属性为事件处理程序

说明:在HTML页面中,设置元素属性为一个函数。

语法:<button onlick="sayHello()">点击</button>

注意:事件属性是以"on"开头,后面跟着事件名称。如:onclick、onload。

示例

JS代码:

function sayHello() {
console.log('hello')
}

HTML代码:

<button onclick="sayHello()">点击</button>

1.2 通过JS设置元素对象的属性为事件处理程序

说明:通过JS获取元素的对象,设置其事件属性为一个事件处理程序。

语法:EventTarget.onEventName=function(e){};

注意:事件属性是以"on"开头,后面跟着事件名称。如:onclick、onload。

唯一性:属性注册具有唯一性;同一个事件,最后注册的处理程序将会覆盖前面注册的处理程序。

示例1:事件属性注册的演示

// 注册body的click事件
document.body.onclick = function (e) {
alert(1);
};

示例2:事件属性注册的唯一性

document.body.onclick=function(e){
console.log(1);
} // 会覆盖前面注册的事件处理程序
document.body.onclick=function(e){
console.log(2);
} document.body.click(); // => 2 :只输出后面属性注册的

1.3 addEventListener()方法注册事件

说明:在JS中,window、document、HtmlElement等对象可以通过addEventListener()方法注册事件的处理程序。

语法:EventTarget.addEventListener(eventName, eventHandler, |useCapture )

参数

①eventName {string} :所要注册的事件名称,不区分大小写。此名称不需要像注册事件属性那样前缀加上"on"。如注册鼠标点击事件,写为click。

②eventHandler {function | function Object} :函数或者函数对象。事件触发时所需要执行的函数;当使用函数对象多次注册同一事件时,只当注册一遍。

③useCapture {boolean} 可选 :是否处于捕获阶段,默认为false。

多次注册:addEventListener()方法能为同一个对象的同一事件注册多次。当发生此事件时,注册的处理事件程序将按照注册先后顺序执行。

注意

①IE9之前的IE的不支持此方法,可使用attachEvent()代替。

②若使用相同的事件处理程序对象多次注册在同一个事件上,只算注册一次。

示例1:多次注册同一事件,按注册顺序执行,先输出1,再输出2

document.body.addEventListener('click',function(e){
console.log('1');
}); document.body.addEventListener('click',function(e){
console.log('2');
}); document.body.click(); // => 1,2

示例2:使用函数对象多次注册同一事件:只当注册一次

function sayHello(){
console.log('hello');
} document.body.addEventListener('click',sayHello);
// 使用处理程序多次注册同一事件,只当注册一次
document.body.addEventListener('click',sayHello); document.body.click(); // => hello :只输出一遍

1.4 attachEvent()方法注册事件

说明:IE9之前的IE版本可通过此方法注册事件。

语法:EventTarget.attachEvent(eventName, eventHandler)

①eventName {string} :所要注册的事件名称,区分大小写。这里的名称跟事件属性一样,以"on"开头,后面跟着事件名称。如:onclick、onload。

②eventHandler {function | function Object} :函数或者函数对象。事件触发时所需要执行的函数;当使用函数对象多次注册同一事件时,可注册多次(addEventListener()方法只当注册一次)。

多次注册:attachEvent()方法能为同一个对象的同一事件注册多次。当触发此事件时,也会依次执行。

示例:

function say(){
console.log('1');
}
document.body.attachEvent('onclick',say);
document.body.attachEvent('onclick',say); // say第二次注册同一事件 document.body.click(); // => 1 1 :输出了2次say函数

1.5 JQuery中的事件注册方式

JQuery中的事件注册方式对多浏览器的差异性进行了解决:判断元素是否含有addEventListener()或者attachEvent()方法。

示例:

function add(element,type, eventHandle){
if (element.addEventListener) {
element.addEventListener(type, eventHandle, false);
} else if (element.attachEvent) {
element.attachEvent("on" + type, eventHandle);
}
}

2. 注销事件

可以注册元素的事件, 相应的可以也注销元素的事件。

JS中,可调用removeEventListener()[对应于addEventListener()] 和detachEvent()[对应于attachEvent()]来注销元素的某个事件指定的处理程序,也可以给事件属性赋值null来注销此事件的所有绑定。

2.1 removeEventListener(eventName, function Object)

说明:注销通过addEventListener()注册的事件处理程序。

语法:EventTarget.removeEventListener(eventName, eventHandlerObj)

参数

①eventName {string} :所要注销的事件名称,不区分大小写。此名称不需要像注册事件属性那样前缀加上"on"。如注册鼠标点击事件,写为click。

②eventHandlerObj {function Object} :函数对象。传入一个函数体是没有效果的。

示例1:通过addEventListener()注销事件

function sayHello(e) {
console.log('1');
} // 注册body click事件
document.body.addEventListener('click', sayHello); // 注销body click事件的sayHello函数
document.body.removeEventListener('click',sayHello); document.body.click(); // 触发click事件,不输出任何结果

示例2:若第二个参数为函数体,将不会注销

function sayHello(e) {
console.log('1');
} // 注册body click事件
document.body.addEventListener('click', sayHello); // 第二个参数为函数体,虽然跟sayHello函数的内容一样,但不会注销
document.body.removeEventListener('click', function(e) {
console.log('1');
}); document.body.click(); // => 1 :输出结果为1,并没有注销成功

  

2.2 detachEvent(eventName, function Object)

说明:注销通过attachEvent()注册的事件处理程序。

语法:EventTarget.detachEvent(eventName, eventHandlerObj)

参数

①eventName {string} :所要注销的事件名称,区分大小写。这里的名称跟事件属性一样,以"on"开头,后面跟着事件名称。如:onclick、onload。

②eventHandlerObj {function Object} ::函数对象。传入一个函数体是没有效果的。

示例1:通过detachEvent()注销事件

function sayHello() {
console.log('1');
}
document.body.attachEvent('onclick', sayHello); document.body.detachEvent('onclick', sayHello); // 注销事件 document.body.click(); // 不输出结果

示例2:若第二个参数为函数体,将不会注销

function sayHello() {
console.log('1');
}
document.body.attachEvent('onclick', sayHello); // 第二个参数为函数体,虽然跟sayHello函数的内容一样,但不会注销
document.body.detachEvent('onclick', function (e) {
console.log('1');
});
document.body.click(); // => 1 :输出结果为1,并没有注销成功

示例3:多次注册与多次注销

因为attachEvent()可以把一个函数对象多次注册到元素同一个事件上,所以调用一次detachEvent()只能注销掉一次。

function sayHello() {
console.log('1');
}
document.body.attachEvent('onclick', sayHello);
document.body.attachEvent('onclick', sayHello); // 注册了2次 document.body.click(); // => 1 1:输出2次 document.body.detachEvent('onclick', sayHello); // 注销1次 document.body.click(); // => 1 :输出结果为1,只注销了1次

2.3 取消事件

给对象的事件属性赋值为null,可取消此事件的所有注册过的处理事件程序。

示例:

document.body.addEventListener('onclick', function(e){
console.log(1);
});
document.body.addEventListener('onclick', function(e){
console.log(2);
}); document.body.onclick=null; // onclick属性赋值为null,相当于注销了onclick事件 document.body.click(); // 无操作
End
菜单加载中...

HTML 事件(二) 事件的注册与注销的更多相关文章

  1. HTML 事件(一) 事件的介绍

    本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...

  2. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  3. C#中的事件注册和注销

    C#中的事件注册和注销 由于.NET框架对消息循环机制进行了很好的封装,开发人员不再需要深入的了解Windows事件/消息实现的具体机制,也无需创建复杂的事件结构体和所谓的消息句柄.我们所要做的无非就 ...

  4. C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构

    (小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...

  5. Lind.DDD.Events事件总线~自动化注册

    回到目录 让大叔兴奋的自动化注册 对于领域事件之前说过,在程序启动时订阅(注册)一些事件处理程序,然后在程序的具体位置去发布(触发)它,这是传统的pub/sub模式的体现,当然也没有什么问题,为了让它 ...

  6. jQuery-委托事件和on方法注册事件

    delegate注册委托事件 delegate--代理.委托 事件代理----事件最终不是由$("#first")执行,它只是代理元素 第一个参数:最终发生事件的元素 第二个参数: ...

  7. WPF路由事件二:路由事件的三种策略

    一.什么是路由事件 路由事件是一种可以针对元素树中的多个侦听器而不是仅仅针对引发该事件的对象调用处理程序的事件.路由事件是一个CLR事件. 路由事件与一般事件的区别在于:路由事件是一种用于元素树的事件 ...

  8. .NET Core 跨平台物联网开发:设置委托事件(二)

    系列教程目录 (一) 连接阿里云IOT (二) 设置委托事件 (三) 上报属性 (四)  SDK文档 属性.方法.委托.类 http://pan.whuanle.cn/index.php?dir=up ...

  9. C#中的委托和事件(二)

    引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些大家常 ...

随机推荐

  1. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  2. C语言 · 奇偶判断

    问题描述 能被2整除的数称为偶数,不能被2整除的数称为奇数.给一个整数x,判断x是奇数还是偶数. 输入格式 输入包括一个整数x,0<=x<=100000000. 输出格式 如果x是奇数,则 ...

  3. 【.net 深呼吸】限制执行代码的权限

    前面好几篇文章,老周都跟大伙伴们聊了跟应用程序域有关的话题,干脆咱们一聊到底吧,做学问就应该这样,有恒心. App Domain的创建新应用程序域的方法中,有一个特殊的重载: public stati ...

  4. 窥探Vue.js 2.0 - Virtual DOM到底是个什么鬼?

    引言 你可能听说在Vue.js 2.0已经发布,并且在其中新添加如了一些新功能.其中一个功能就是"Virtual DOM". Virtual DOM是什么 在之前,React和Em ...

  5. 算法与数据结构(十七) 基数排序(Swift 3.0版)

    前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...

  6. Redis的简单动态字符串实现

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,sds)的抽象类 ...

  7. Discuz NT 架构剖析之Config机制

    接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...

  8. Docker与CI持续集成/CD

    背景        Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制 ...

  9. gulp批量打包文件并提取公共文件

    gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器. browseriyf是模块化打包工具. 一般情况下,Browserify 会把所有的模块打包成单个文件.单个文件在大多数情况下是 ...

  10. Log4Net应用问题

    问题 一.日志存储方式 1.txt 2.SQLServer数据库 3.log文件 二.项目类型不同 1winFrom 2webFrom 3MVC 4WPF 5控制台 三.切分依据不同 1.空间大小 2 ...