javascript - 如何检查jQuery中是否已经存在相同的事件处理程序
问题描述
如果两个不同的进程向一个元素添加一个点击处理程序。这两个处理程序都是必需的。我想要做的是检查其中一个处理程序是否已经存在。
我可以用:
$._data(ele, "events")
获取元素上的所有事件,但我怎么知道哪个点击事件处理程序是我想要的?
ele.click(handler1);
ele.click(handler2);
var handlers = $._data(ele,get(0), "events");
if (*some code that finds if handler1 is already there*)
...
使用 jQuery 2.1.4(无法更改)。
解决方案
寻找特定的处理程序
const handlerIs = ($ele, handler, func) => {
const events = $._data($ele.get(0), "events");
func = func.toString();
return events &&
events[handler]?.some(ev => ev.handler.toString() === func);
};
const $ele = $("button");
const clicked = () => alert("clicked");
$ele.on("click", clicked)
$ele.on("click", clicked)
if (handlerIs($ele, "click", clicked)) {
console.log(`click clicked exists on ${$ele.get(0).tagName}`);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<button type="button">Mouseover or click</button>
只是寻找点击处理程序
它可以实现为 $fn 被称为 $ele.hasHandler...
const hasHandler = ($ele,handler) => Object.keys($._data($ele.get(0), "events"))
.filter(key => key===handler).length>0;
const $ele = $("button");
$ele.on("click",function() { alert("clicked") }); // define click once
if (!hasHandler($ele,"click")) { // test before trying again
$ele.on("click",function() { console.log("another click") });
}
else console.log(`click already found on ${$ele.get(0).tagName}`)
/*
Object.entries($._data($ele.get(0), "events"))
.forEach(ent => console.log(ent[0],ent[1][0].handler))
*/
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<button type="button">Mouseover or click</button>
推荐阅读
- c++ - 当标头包含c ++时运行函数
- laravel - Laravel 中未定义的偏移量:0(查看:path\profile.blade.php)问题
- html - iOS Safari (iPhone SE) 自动完成不工作 添加了 HTML5 自动完成属性
- javascript - javascript加入类似的数组
- sendgrid - sendgrid 每个键可以有不同的 requiretls 设置吗?
- ruby-on-rails - 凭证文件未在 Amazon Linux 上读取 Rails 6.1
- javascript - 你如何使用事件委托来切换 Font Awesome 5 SVG 图标?
- java - 如何在 Android JAVA 的列表视图中显示部分但不是全部 JSON 数据
- html - 使用样式组件垂直对齐 div 中的文本
- laravel - Laravel 控制器触发模式以显示数据