JavaScript移除匿名事件处理函数的方法

用addeventlistener()和attachevent()给一个dom元素绑定事件处理程序时,如果传入一个匿名函数,那么用相应的removeeventlistener()和detachevent()是无法将这个匿名的处理程序解除绑定的。所以我们用的时候应该传入一个函数表达式。

那么,想使用匿名函数进行绑定和解绑,怎么解决?

思路

这两个函数都不接受匿名函数进行解绑,那么就不能依靠他们来管理事件了,所以自定义一个对象来事件。
事件处理程序的本质就是,当一个事件在一个对象上发生时,执行监听这个事件的函数。

一个DOM元素可能被绑定多个事件类型的处理程序。比如click的时候颜色改变,mouseover的时候变大。

一个事件类型可能绑定多个事件处理程序。比如mouseover的时候又变色又变大。

立即学习“Java免费学习笔记(深入)”;

所以,这个事件对象应该有一个属性用来存储这个DOM元素上绑定的所有事件处理程序,还应该有两个方法,一个用来添加,一个用来删除。

{    handlers:{    type1:[handler1,handler2],    type2:[handler1,handler2],    ...//其他事件类型和对应的事件处理函数    },    on:function(){},    off:function(){}}

登录后复制

当一个事件发生时,就调用这个对象里面对应的事件类型的数组里面的所有函数。

所以绑定事件就是往对应的数组里面添加函数,解除绑定事件就是把这个函数从这个数组里面删掉。

那么怎么保证操作的是那个正确的DOM元素呢?

显然,每个DOM元素都应该需要一个这样的对象,用于管理自己的事件处理程序。使这个事件管理对象成为dom元素的属性就保证了操作的是正确的dom元素

实现

每个DOM元素都需要这样一个对象,而且每个对象中的on()和off()方法都是相同的,所以需要一个构造函数,把这两个方法放到他的原型对象中去。

    function EventManage() {        this.handlers = {}    }    EventManage.prototype = {        on: function (type, handler) {            if (!this.handlers[type]) {                this.handlers[type] = [handler]                return true //避免添加多个事件            } else {                this.handlers[type].push(handler)            }        },        off: function (type, handler) {            for (var i = 0; i 

每个对象有了这两个方法,就可以自行添加和移除事件处理程序了,但是,监听事件,还是要靠JavaScript提供的方法,所以借用addEventListner()和attachEvent()来监听事件:

    var EventUtil = {};    EventUtil.on = function (ele, type, handler) {        if (!ele.event) {            ele.event = new EventManage();            console.log(ele.event.handlers)        }        var isNewType = ele.event.on(type, handler);        var fire = function () {            for (var i = 0; i 

这里要注意一个问题,每次使用EventUtil.on()时都会重新定义一个fire函数,addEventListener()就会给相同的事件类型添加多个相同的事件处理程序,所以需要判断一下这个事件类型是不是新增的,如果是的话再用addEventListener()来监听这个事件类型。

使用示例:

var btn=document.getElementById(“btn”);EventUtil.on(btn,”click”,function(){   console.log(“11”);}); EventUtil.on(btn,”click”,function(){   console.log(“22”); }); EventUtil.off(btn,”click”,function(){   console.log(“11”); });

登录后复制

以上就是JavaScript移除匿名事件处理函数的方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2781601.html

(0)
上一篇 2025年3月8日 16:19:38
下一篇 2025年3月8日 16:19:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 用js快速的获取html页面中图片的地址

    这次给大家带来用js快速的获取html页面中图片的地址,用js快速获取html页面中图片的地址的注意事项有哪些,下面就是实战案例,一起来看一下。 这篇文章主要介绍了js获取html代码中图片地址的实现代码,需要的朋友可以参考下 第一种方法:…

    编程技术 2025年3月8日
    200
  • js实现多个字符串首尾重复拼接

    本文主要和大家分享js实现多个字符串首尾重复进行拼接,字符串数组,字符串之间首尾重复,去除重复部分,进行拼接,希望能帮助到大家。 var j=0;var isRepeat = nullvar index = nullvar res = ne…

    编程技术 2025年3月8日
    200
  • js限定输入最大字节数实例

    本文主要和大家分享js限定输入最大字节数实例,找了好久,终于找到了一个好的解决方法,希望能帮助到大家。 nbsp;html>  function limitInputCharLen(str, maxLen) {var w = 0;va…

    编程技术 2025年3月8日
    200
  • javascript模块加载器是怎么运行的

    这次给大家带来javascript模块加载器是怎么运行的,javascript模块加载器运行的注意事项有哪些,下面就是实战案例,一起来看一下。 定义 var MyModules = (function Manager() { var mod…

    编程技术 2025年3月8日
    200
  • JS执行环境及作用域分析

    执行环境:定义了变量或函数有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。 全局执行环境:是最外围的一个执行环境。在web浏览器中,全局执行环境被认为是wind…

    编程技术 2025年3月8日
    200
  • JS实现todolist详解

    这次给大家带来JS实现todolist详解,JS实现todolist的注意事项有哪些,下面就是实战案例,一起来看一下。 本篇文章给大家介绍了通过原生JavaScript实现todolist功能相关知识点,对此有需要的朋友可以学习下。 该项目…

    2025年3月8日
    200
  • javascript中||和&&的使用方法

    javascript逻辑运算符 || 和 && 在数字中的使用 ,javascript中各种运算符的优先级,从高到低:  1、()  优先级最高 2、一元运算符  ++   –   ! 3、算数运算符  先*  /  %  …

    编程技术 2025年3月8日
    200
  • js数据结构和算法之栈和队列详解

    1.定义 栈是一种重要的线性结构。栈(stack)是一个后进先出(last in first out,lifo)的线性表,它要求只在表尾进行删除和插入操作。对于栈来说,这个表尾称为栈的栈顶,相应的表头称为栈底。 栈的操作只能在这个线性表的表…

    2025年3月8日
    200
  • JavaScript如何格式化时间的方法

    本文为大家分享了javascript时间格式化的方法,分享给大家供大家参考,可以说是Web项目中不可或缺的一个Javascript类库,它可以帮助你快速的解决客户端编程的许多问题,下面贴出一个用js格式化时间的方法。 Date.protot…

    编程技术 2025年3月8日
    200
  • JS计算日期时间差

    这次给大家带来js计算日期时间差,js计算日期时间差的注意事项有哪些,下面就是实战案例,一起来看一下。 js判断日期时间的代码如下所示: alert(GetDateDiff(“2018-02-27 19:20:22”,”2018-02-27…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论