偶尔看到了这个问题,如何用JS获取元素某一事件上绑定的所有Listener?

突然觉得好像是有解决办法的,查了下,在 chrome 下,支持

window.getEventListeners(obj)

例如:

addEvent(aLink, 'click',f, false);
window.getEventListeners(aLink)

返回:

如果要模仿 chrome 实现呢,也是可以的,需要修改 addEventListener 和 removeEventListener,或者你自己自定义一个也行,比如我实现后的效果:

基本上是模仿了,chrome 定义的全局方法,我是绑定在每一个事件对象的属性上,通过 obj.eventList 来访问,具体代码如下:

var aLink = document.links[0];

function addEvent(obj, type, callback, useCapture) {
obj.addEventListener(type, callback, useCapture);
addEventList(obj, type, callback, useCapture);
} function removeEvent (obj, type, callback, useCapture) {
obj.removeEventListener(type, callback, useCapture);
removeEventList(obj, type, callback, useCapture);
} function addEventList(obj, type, callback, useCapture) {
if (obj.eventList) {
if (obj.eventList[type]) {
obj.eventList[type].push({ callback: callback, useCapture: useCapture });
} else {
obj.eventList[type] = [{ callback: callback, useCapture: useCapture }];
}
} else {
obj.eventList = {};
obj.eventList[type] = [{ callback: callback, useCapture: useCapture }];
}
} function removeEventList(obj, type, callback, useCapture) {
var eventList=obj.eventList;
if (eventList) {
if (eventList[type]) {
for (var i = 0; i < eventList[type].length; i++) {
if (eventList[type][i].callback===callback) {
eventList[type].splice(i, 1);
if (eventList[type].length===0) {
delete eventList[type];
}
break;
}
}
}
}
} function f () {
event.preventDefault();
alert('f');
}
function g () {
event.preventDefault();
alert('g');
}
function h () {
event.preventDefault();
alert('h');
} addEvent(aLink, 'click', f, false);
addEvent(aLink, 'click', g, false);
addEvent(aLink, 'mouseup', h, false);
console.log(aLink.eventList);

但是这样的缺点也很明显,只能通过 addEvent 来绑定事件,不能通过其他的方式来绑定,不然还是获取不到,所以远没有 chrome 的方法强大,不过这个实现我觉得还是有点意思的,就留了个博客,,,

获取 js DOM元素中绑定的所有事件,模仿 chrome getEventListeners的更多相关文章

  1. vue中一个dom元素可以绑定多个事件?

    其实这个问题有多个解决方法的  这里提出两点 第一种 第二种 现在dom上绑定一个 然后在你的methods中直接调用 如果要传参数  这时候千万别忘记 原创 如需转载注明出处 谢谢

  2. JS获取HTML DOM元素的方法

    JS获取HTML DOM元素有八种方法: 1.根据id获取标签元素: document.getElementById("id名"); 2.根据标签名获取标签列表: document ...

  3. Jquery 方式获取 iframe Dom元素

    Jquery 方式获取 iframe Dom元素 測试页面代码: <html>  <head>   <title>jquery方式,訪问iframe页面dom元素& ...

  4. (转载)js(jquery)的on绑定点击事件执行两次的解决办法

    js(jquery)的on绑定点击事件执行两次的解决办法—不是事件绑定而是事件冒泡 遇到的问题:jquery中用.on()给页面中新加的元素添加点击事件时,点击事件源,绑定的事件执行两次,这里的ale ...

  5. JQuery 动态加载 HTML 元素时绑定点击事件无效问题

    问题描述 假设项目中有一个列表页面,如下: 当点击列表一行数据可以显示详情页面,而详情页面的数据是根据当前行的数据作为参数,通过 ajax 请求到后台返回的数据,再根据返回的结果动态生成 html 页 ...

  6. JS获取HTML DOM元素的8种方法

    什么是HTML DOM 文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展置标语言的标准编程接口.简单理解就是HTML DOM 是关于如何获取.修改.添加或删除 ...

  7. 原生JS获取HTML DOM元素的8种方法

    JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...

  8. VUE中v-on:click事件中获取当前dom元素

    在开发中总是忘记, 特意在此记录 关键字:   $event     <div class="bed" v-on:click="updateBed(index,$e ...

  9. D3.js 选择元素和绑定数据/使用数据

    选择元素和绑定数据是 D3 最基础的内容,本文将对其进行一个简单的介绍. 一.如何选择元素 在 D3 中,用于选择元素的函数有两个: d3.select():是选择所有指定元素的第一个 d3.sele ...

随机推荐

  1. unity, 鼠标与场景交点

    在鼠标与场景交点上放一个mark,并于1s后消失: 新建一个空GameObject,命名为moushHitTest,添加下面脚本: using UnityEngine;using System.Col ...

  2. MySQL-Transfer2.3发布

    Transfer 2.3发布,下载地址 此版本除了升级based版本外 *优化了无索引表的同步性能 *优化了slave模式下超大事务内存消耗问题 *Transfer模式相关的功能改动较多 *修复tra ...

  3. Oracle 10g 数据库的备份和还原

    一.备份数据库 1.在图形工具中,如sqldeveloper,pl/sqldeveloper用以下这句查找空表 select 'alter table '||table_name||' allocat ...

  4. redis 做为缓存服务器 注项!

    作为缓存服务器,如果不加以限制内存的话,就很有可能出现将整台服务器内存都耗光的情况,可以在redis的配置文件里面设置: # maxmemory <bytes> #限定最多使用1.5GB内 ...

  5. 基于HTML5自定义文字背景生成QQ签名档

    分享一款利用HTML5实现的自定义文字背景应用,首先我们可以输入需要显示的文字,并且为该文字选择一张背景图片,背景图片就像蒙版一样覆盖在文字上.点击生成QQ签名档即可将文字背景融为一体生成另外一张图片 ...

  6. shell监控脚本,不考虑多用户情况

    #!/bin/bash CheckProcess() { if [ "$1" = "" ]; then fi PROCESS_NUM=`ps -ef | gre ...

  7. 记一次线上Kafka消息堆积踩坑总结

    2018年05月31日 13:26:59 xiaoguozi0218 阅读数:2018更多 个人分类: 大数据   年后上线的系统,与其他业务系统的通信方式采用了第三代消息系统中间件Kafka.由于是 ...

  8. datagrid columns

    columns: [[ { field: 'Source_Id', title: 'Source_Id', hidden: true }, //{ field: 'Current_Value', hi ...

  9. 【转】H5页面的测试点总结

    在此对H5页面的测试点(以及容易出问题的点)  1.业务逻辑相关  除基本的功能测试之外,H5页面的测试,需要关注以下几点:  1.1 登陆  目前H5与native各个客户端都做了互通,所以大家在测 ...

  10. C++ 运算符重载三(链式编程)

    //运算符重载之链式编程 #include<iostream> using namespace std; //对于友元函数重载运算符只适用于左操作数是系统变量的场景 //因为成员无法在系统 ...