JavaScript注册监听事件与清除监听事件

news2025/7/19 17:02:21

JavaScript中有两种方法可以注册监听事件,一种是传统的注册方式,on+事件名称的注册方法,如btn.onclick,还有方法监听事件注册方式, addEventListener()和ie8以下的attachEvent()。

注册监听事件

传统方式

语法格式:元素名.on+事件名称 = function () {函数代码}

这种方法只能为元素注册一个事件,如果注册多个,那么就会覆盖。

这种方式比较简单,看一个案例

点击事件案例:判断闰年

我们写一个输入框和按钮,给按钮注册点击事件,在按钮点击的时候,判断输入框里面输入的值是否是闰年。

 <input type="text" id="inp" />
    <button id="nian">输入年份后点击判断</button>
var nian = document.getElementById("nian");
var inp = document.getElementById("inp");

nian.onclick = function () {
  var a = inp.value;
  if (a == null || a == 0) {
    alert("没有输入年份!");
  } else if (a <= 0) {
    alert("输入年份有错误!");
  } else if (a % 400 == 0 || (a % 4 == 0 && a % 100 != 0)) {
    alert("输入年份为闰年!");
  } else {
    alert("输入年份不是闰年!");
  }
};

 

 方法监听事件注册方式

addEventListener()

我们使用addEventListener()来注册监听。它可以为一个事件源注册多个事件。

语法:

btn.addEventListener('click', function () {函数代码块}, false)

第一个参数:事件类型,如click

第二个参数:回调函数,事件发生后要运行的内容

第三个参数:布尔值,默认是false,决定是否支持冒泡

注意,在在标准浏览器浏览器下,addEventListener()是可用的。但是在ie8之下addEventListener()无法使用。这时候我们使用attachEvent()来注册监听事件。

attachEvent()

语法:

btn.attachEvent('onclick',function(){函数代码块},false)

参数是基本相同,注意attachEvent()的第一个参数,需要在事件前面加'on'。

addEventListener()与attachEvent()的兼容

在不同浏览器下,存在注册监听事件的兼容问题,我们可以写一个函数来解决这个问题,把函数封装起来方便随时调用,这样也可以加深两个方法的理解。

代码如下,我们给按钮注册点击事件。 注释有详解。

var btn = document.getElementById('btn')//获取按钮
function clicks(controls, events, buer) {//三个形参
            if (controls.addEventListener) {//判断addEventListener是否可以使用
                controls.addEventListener(events, function () {//添加监听事件
                    console.log('标准浏览器');//打印输出
                }, buer)
            } else {//判断不兼容addEventListener,所以使用attachEvent
                controls.attachEvent('on' + events, function () {//注意不要忘了这个on
                    console.log('非标准浏览器');
                }, buer)
            }
        }
        clicks(btn, 'click', false)//调用与传参

移除监听事件

传统方法的移除

我们在使用 元素名.on+事件名称 = function () {函数代码}的方式注册监听事件的时候,只需要使用

元素名.on+事件名称 =null,就可以移除监听事件。

移除方法监听事件注册方式

removeEventListener()

语法:元素名.removeEventListener('事件名称',函数)

内容分别是:移除哪个元素(事件源/元素名),通过什么方式触发(事件类型)的什么事件(事件回调)

removeEventListener()是常用的移除监听事件的方法。但在ie8以下,它是不可以使用的。所以我们使用detachEvent()来为ie8之下的浏览器清除监听事件。

btn.detachEvent()

元素名.detachEvent('on+事件名称, 函数)

 基本与removeEventListener()相同,但注意事件名称前面加'on'

removeEventListener()与btn.detachEvent()的兼容

我们可以效仿addEventListener()与attachEvent()的兼容解决办法写一个函数。

如下:

function getEvent(element, eventName, callback) {
if (element.removeEventListener) {
    //标准浏览器的注册监听
    element.removeEventListener(eventName, callback)
} else {
    //非标准浏览器的注册监听
    element.detachEvent('on' + eventName, callback)
}
}

getEvent(btn,'click',fun)

案例:注册监听与移除事件的结合

我们写一个案例,来实现注册监听,和移除事件。

首先写两个案例,第一个按钮注册监听事件,如点击事件,点击一下就打印一串文字。为第二个按钮注册点击事件,第二个按钮点击后移除事件,使得第一个按钮点击后无法打印文字。

也要注意注册监听和移除事件的兼容,一并写入代码中。

代码如下:

        var btn = document.getElementById('btn')
        var btn1 = document.getElementById('btn1')
        function fun() {//函数:打印一串文字
            console.log('标准浏览器');
        }
        function fn() {//函数:打印一串文字
            console.log('非标准浏览器');
        }
        function clicks(controls, events, buer) {//为按钮1注册点击事件的兼容
            if (controls.addEventListener) {
                controls.addEventListener(events, fun, buer)//调用之前的打印函数
                console.log('添加了点击事件');
            } else {
                controls.attachEvent('on' + events, fn, buer)
                console.log('添加了点击事件');
            }
        }
        clicks(btn, 'click', false)//函数调用
        btn1.onclick = function () {//为按钮2注册监听事件
            function rem(controls,events, functionname) {//为按钮2注册移除事件的兼容
                if (controls.removeEventListener) {
                    controls.removeEventListener(events, functionname)
                } else {
                    controls.detachEvent('on' + events, functionname)
                }
            } 
            rem(btn, 'click', fun)//函数调用
            console.log('现在清除了按钮1的点击事件');

        }

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/406877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6笔记————let,箭头函数,剩余参数

目录 一.let,var,const区别 let const 区别 二&#xff0c;解构 1 数组解构 2对象解构 三&#xff0c;箭头函数 1 基础语法 2 省略写法 3 对象方法里的this 4 apply/call调用时的this 5 箭头函数中this 8 箭头函数应用 四&#xff0c;剩余函数 一.let,var,con…

【bug】Failed at the node-sass@4.14.1 postinstall script(终于圆满解决)

花了两个小时才解决 首先是从git上克隆项目到本地&#xff0c;然后安装nodele_modules&#xff0c;输入npm i安装 安装到一半报错 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! node-sass4.14.1 postinstall: node scripts/build.js npm ERR! Exit status 1 npm ERR! …

关于 Vue “__ob__:Observer“ 属性的解决方案

问题描述 我们操作 Vue 数据的时候&#xff0c;经常会看到这个属性: __ob__:Observer在我们操作这个数据的时候&#xff0c;如果想要单独拿这个数据里面的值&#xff0c;就会返回 undefined经过我在网上查找相关资料&#xff0c;发现 __ob__:Observer 是 Vue 中一个非常重要的…

【vue】diff 算法详解

一、diff算法是什么 diff算法是一种通过同层的树节点进行比较的高效算法 diff算法的目的就是找出新旧不同虚拟DOM之间的差异,使最小化的更新视图&#xff0c;所以 diff 算法本质上就是比较两个js对象的差异 特点 1. 比较只会在同层级进行&#xff0c;不会跨层级比较 2. 在diff…

原生JS实现飞机大战游戏 超详细解析 快来做一个自己玩吧

目录 1. 案例分析&#x1f4a8; 2. 适配设备 &#x1f4a8; 3. 背景滚动&#x1f4a8; 4. hero操作&#x1f4a8; 5. 敌机的创建与运动&#x1f4a8; 6. 子弹的创建与运动&#x1f4a8; 7. 碰撞检测&#x1f4a8; 8. 统计得分&#x1f4a8; 9. 设置开始与结束界面&…

疫情散去想看电影,使用css3动画实现一个阿凡达2完美开场

在历经了艰苦卓绝的3年抗疫后&#xff0c;疫情终于还是来了&#xff0c;很多小伙伴变成了小洋人酸奶&#xff0c;我相信过不了多少天&#xff0c;疫情终将散去&#xff0c;那个时候就可以和家人走进电影院啦。 今天用css布局一个阿凡达2的影院场景&#xff0c;提前过一过瘾。 目…

《uni-app》表单组件-form表单

本文分享的Form组件为uni-app的内置组件Form&#xff0c;非扩展组件&#xff0c;两者在用法上其实大同小异&#xff0c;只是扩展组件的属性以及事件更多…没有本质上的区别&#xff5e; 《uni-app》表单组件-form表单一. 简介二. 基础用法三. submit事件四. reset事件五. repor…

Tomcat安装配置及IDEA配置方法【亲测有效】

Tomcat安装配置及IDEA配置1.下载Tomcat2.配置Tomcat环境变量3.安装Tomcat4.启动Tomcat5.测试Tomcat6.IDEA配置Tomcat1.下载Tomcat Tomcat9官网下载地址 选择自己需要的版本&#xff0c;一般选择Windows 64位压缩包版本&#xff1a; 下载完后安装解压即可&#xff0c;解压后的…

如何使用nvm切换node版本

我比较懒惰,如非必要,不喜欢npm版本切换来切换去,感觉浪费我编程的时间.后来发现,现在偷的懒都是为将来的忙碌埋下的祸根. 言归正传,本文主要是讲解一下,如何使用nvm进行npm版本的切换. 工欲善其事必先利其器,我们先下载nvm;直接上下载链接(针对windows哈,毕竟我没mac本); 下载…

Code For Better 谷歌开发者之声——初识Web与谷歌,拉起兴趣之心。

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;程序是我的生命,但我相信爱她甚过爱我的生命。 目录一、了解谷歌浏览器1. 简介2.优点二、认识Web1. 简介2. 特点2. 网…

【云原生 | 21】Docker运行Web服务实战之Apache

作者简介&#xff1a;&#x1f3c5;云计算领域优质创作者&#x1f3c5;新星计划第三季python赛道第一名&#x1f3c5; 阿里云ACE认证高级工程师&#x1f3c5; ✒️个人主页&#xff1a;小鹏linux &#x1f48a;个人社区&#xff1a;小鹏linux&#xff08;个人社区&#xff09;欢…

【微信小程序】如何获得自己当前的定位呢?本文利用逆地址解析、uni-app带你实现

目录 前言 效果展示 一、在腾讯定位服务配置微信小程序JavaScript SDK 二、使用uni-app获取定位的经纬度 三、 逆地址解析&#xff0c;获取精确定位 四、小提示 前言 效果展示 一、在腾讯定位服务配置微信小程序JavaScript SDK 在浏览器搜索腾讯定位服务&#xff0c;找…

React(四) ——hooks的使用

&#x1f9c1;个人主页&#xff1a;个人主页 ✌支持我 &#xff1a;点赞&#x1f44d;收藏&#x1f33c;关注&#x1f9e1; 文章目录⛳React Hooks&#x1f4b8;useState(保存组件状态)&#x1f948;useEffect(处理副作用)&#x1f50b;useCallback&#xff08;记忆函数&#…

Sass 和 SCSS

▣Sass (Syntactically Awesome StyleSheets)&#xff0c;是由buby语言编写的一款css预处理语言&#xff0c;和html一样有严格的缩进风格&#xff0c;和css编写规范有着很大的出入&#xff0c;是不使用花括号和分号的&#xff0c;所以不被广为接受。 Sass 是一款强化 CSS 的辅助…

使用Nodejs搭建HTTP服务,并实现公网远程访问「内网穿透」

文章目录前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口5.固定公网地址前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff08;原…

微信小程序|基于小程序+云开发制作一个菜谱小程序

今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力。 一、小程序1. 创建小程序</

【python】喜欢XJJ?这不得来一波大采集?

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 俗话说的好&#xff1a;技能学了~就要用在自己喜欢得东西上&#xff01;&#xff01; 这我不得听个话~我喜欢小姐姐&#xff0c;跳舞的小姐姐 这不得用python把小姐姐舞采集下来~嘿嘿嘿 完整源码、素材皆可点击文章下方名片…

Java web学生信息管理系统(jsp)

&#x1f95e;目录 &#x1f36c;1 概述 1.1课程设计目的 1.2预备知识 JAVAWeb&#xff1a; MySQL&#xff1a; JSP&#xff1a; 1.3实训的内容和要求 &#x1f36c;2 需求分析 2.1系统目标 2.2功能分析&#xff1a; 2.3开发环境&#xff1a; &#x1f36c;3 设计步…

大数据热点城市波动图案例【CSS3实现 + 原理分析 + 源码获取】

一&#xff1a;案例效果 本次案例我们分析一下数据可视化页面最常见的热点图是如何实现的&#xff0c;其原理并不复杂&#xff0c;只需要用到CSS3动画属性 animation 以及 keyframe 关键帧即可&#xff0c;重点是向外扩散的环如何布局比较合适&#xff0c;以及每个环怎么扩散何…

HTML 5标签搭建页面结构--1

本文标签: HTML基本语法 排版标签 媒体标签 链接标签 文章目录 前言 一、基础认识 1.认识网页 2.微博标准 3.web标准的构成 4.小结 二、HTML基本结构解读 2.HTML标签及结构 1.标签的结构: 2.排版标签: 2.文本格式化标签: 3.媒体标签: 1.图像相关标签: 2.图片标签的 title …