JS addEventListener()和attachEvent()方法实现注册事件


Posted in Javascript onJanuary 11, 2021

在 JavaScript 的 DOM 事件模型中,通过调用对象的 addEventListener() 方法注册事件。用法如下:
element.addEventListener(String type, Function listener, boolean useCaptrue);

参数说明如下:

  • type:注册事件的类型名。事件类型与事件属性不同,事件类型名没有 on 前缀。例如,对于事件属性 onclick 来说,所对应的事件类型为 click。
  • listener:监听函数,即事件处理函数。在指定类型的事件发生时将调用该函数。在调用这个函数时,默认传递给它的唯一参数是 event 对象。
  • useCaptrue:是一个布尔值。如果为 true,则指定的事件处理函数将在事件传播的捕获阶段触发;如果为 false,则事件处理函数将在冒泡阶段触发。

示例1

下面示例使用 addEventListener() 为所有按钮注册 click 事件。首先,调用 document 的 getElementsByTagName() 方法捕获所有按钮对象;然后,使用 for 语句遍历按钮集(btn),并使用 addEventListener() 方法分别为每一个按钮注册事件函数,获取当前对象所显示的文本。

<button id="btn1" onclick="btn1();">按 钮 1</button>
<button id="btn2" onclick="btn2(event);">按 钮 2</button>
<script>
  var btn = document.getElementsByTagName("button"); //捕获所有按钮
  for(var i in btn){          //遍历按钮集合
   btn[i].addEventListener("click", function(){
    alert(this.innerHTML);
  }, true);  //为每个按钮对象注册一个事件处理函数,定义在捕获阶段进行响应
  }
</script>

在浏览器中预览,单击不同的按钮,则浏览器会自动显示按钮的名称。效果如图所示:

JS addEventListener()和attachEvent()方法实现注册事件

使用 addEventListener() 方法能够为多个对象注册相同的事件处理函数,也可以为同一个对象注册多个事件处理函数。为同一个对象注册多个事件处理函数对于模块化开发非常有用。

示例2

在下面示例中,为段落文本注册两个事件:mouseover 和 mouseout。当光标移到段落文本上面时会显示为蓝色背景,而当光标移出段落文本时会自动显示为红色背景。这样就不需要破坏文档结构为段落文本增加多个事件属性。

<p id="p1">为对象注册多个事件</p>
<script>
  var p1 = document.getElementById("p1"); //捕获段落元素的句柄
  p1.addEventListener("mouseover", function () {
    this.style.background = 'blue';
  }, true); //为段落元素注册第1个事件处理函数
  p1.addEventListener("mouseout", function () {
    this.style.background = 'blue';
  }, true); //为段落元素注册第2个事件处理函数
</script>

IE 事件模型使用 attachEvent() 方法注册事件。用法如下:

element.attachEvent(etype, eventName)

参数列表如下:

  • etype:设置事件类型,如 onclick、onkeyup、onmousemove 等。
  • eventName:设置时间名称,也就是事件处理函数。

示例3

在下面示例中,为段落标签 <p> 注册两个事件:mouseover 和 mouseout,设计当光标经过时,段落文本背景色显示为蓝色,当光标移开之后,背景色显示为红色。

<p id="p1">为对象注册多个事件</p>
<script>
  var p1 = document.getElementById("p1"); //捕获段落元素
  p1.attachEvent("onmouseover", function () {
    this.style.background = 'blue';
  }); //注册mouseover事件
  p1.attachEvent("onmouseout", function () {
    this.style.background = 'red';
  }); //注册mouseout事件
</script>

使用 attachEvent() 注册事件时,其事件处理函数的调用对象不再是当前事件对象本身,而是 window 对象,因此事件函数中的 this 就指向 window,而不是当前对象,如果要获取当前对象,应该使用 event 的 srcElement 属性。

IE 事件模型中的 attachEvent() 方法第 1 个参数为事件类型名称,需要加上 on 前缀,而使用 addEventListener() 方法时,则不需要这个 on 前缀,如 click。

到此这篇关于JS addEventListener()和attachEvent()方法实现注册事件的文章就介绍到这了,更多相关JS addEventListener()和attachEvent()内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
学习jquery必备 api中英文对照的chm手册 下载
May 03 Javascript
window.onload 加载完毕的问题及解决方案(下)
Jul 09 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
JavaScript中实现继承的三种方式和实例
Jan 29 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
Mar 10 Javascript
js控制网页前进和后退的方法
Jun 08 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
Apr 28 Javascript
Vue集成Iframe页面的方法示例
Dec 12 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
Feb 26 Javascript
vue实现的封装全局filter并统一管理操作示例
Feb 02 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
May 28 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
Aug 07 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 #Javascript
详解ES6 中的Object.assign()的用法实例代码
Jan 11 #Javascript
vue实现防抖的实例代码
Jan 11 #Vue.js
详解uniapp的全局变量实现方式
Jan 11 #Javascript
微信小程序抽奖组件的使用步骤
Jan 11 #Javascript
JS数组索引检测中的数据类型问题详解
Jan 11 #Javascript
了不起的11个JavaScript代码重构最佳实践小结
Jan 11 #Javascript
You might like
深入密码加salt原理的分析
2013/06/06 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
2019/10/12 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
javascript实现类似百度分享功能的方法
2015/07/27 Javascript
jQuery为动态生成的select元素添加事件的方法
2016/08/29 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
js模拟实现百度搜索
2020/06/28 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
在Python的Django框架中创建语言文件
2015/07/27 Python
Django URL传递参数的方法总结
2016/08/28 Python
Python引用计数操作示例
2018/08/23 Python
解决pandas .to_excel不覆盖已有sheet的问题
2018/12/10 Python
python 内置模块详解
2019/01/01 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
pycharm的python_stubs问题
2020/04/08 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
一款纯css3实现的响应式导航
2014/10/31 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
澳大利亚领先的皮肤诊所:Skin Matrix(抗衰老、痤疮专家、药妆护肤)
2018/05/20 全球购物
大学生求职中的自我评价
2013/10/01 职场文书
化验室技术员岗位职责
2013/12/24 职场文书
职业生涯规划设计步骤
2014/01/12 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
《云房子》教学反思
2014/04/20 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
党性分析自查总结
2014/10/14 职场文书
《司马光》教学反思
2016/02/22 职场文书
MySQL 百万级数据的4种查询优化方式
2021/06/07 MySQL
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang