有没有一种方法在jQuery中检查事件是否存在?我正在开发一个使用自定义命名空间事件的插件,并希望能够检查事件是否已经绑定到元素上。
有没有一种方法在jQuery中检查事件是否存在?我正在开发一个使用自定义命名空间事件的插件,并希望能够检查事件是否已经绑定到元素上。
$('body').click(function(){ alert('test' )})
var foo = $.data( $('body').get(0), 'events' ).click
// you can query $.data( object, 'events' ) and get an object back, then see what events are attached to it.
$.each( foo, function(i,o) {
alert(i) // guid of the event
alert(o) // the function definition of the event handler
});
你可以通过将对象引用(不是 jQuery 对象)传递给 $.data,然后将第二个参数设置为 'events',这样会返回一个包含所有事件(如 'click')的对象。你可以循环浏览该对象,以查看事件处理程序执行了什么操作。
你可以使用:
$("#foo").unbind('click');
为了确保所有点击事件都被解除绑定,然后再附加你的事件。检查元素上的事件:
var events = $._data(element, "events")
请注意,这仅适用于直接事件处理程序。如果您正在使用$(document).on("event-name", "jq-selector", function() { //logic }),则需要查看此答案底部的getEvents函数。
例如:
var events = $._data(document.getElementById("myElemId"), "events")
或者
var events = $._data($("#myElemId")[0], "events")
完整示例:
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
<script>
$(function() {
$("#textDiv").click(function() {
//Event Handling
});
var events = $._data(document.getElementById('textDiv'), "events");
var hasEvents = (events != null);
});
</script>
</head>
<body>
<div id="textDiv">Text</div>
</body>
</html>
一种更完整的检查方式,包括使用$(document).on安装的动态监听器
function getEvents(element) {
var elemEvents = $._data(element, "events");
var allDocEvnts = $._data(document, "events");
for(var evntType in allDocEvnts) {
if(allDocEvnts.hasOwnProperty(evntType)) {
var evts = allDocEvnts[evntType];
for(var i = 0; i < evts.length; i++) {
if($(element).is(evts[i].selector)) {
if(elemEvents == null) {
elemEvents = {};
}
if(!elemEvents.hasOwnProperty(evntType)) {
elemEvents[evntType] = [];
}
elemEvents[evntType].push(evts[i]);
}
}
}
}
return elemEvents;
}
使用示例:
getEvents($('#myElemId')[0])
使用 jQuery事件过滤器
你可以像这样使用它
$("a:Event(click)")
jQuery(selector).data('events').click
您可以使用each或for等迭代方法进行遍历,例如检查长度以进行验证:
jQuery(selector).data('events').click.length
希望这能对某些人有所帮助。 :)
这对我很有用,它显示了发生的事件的对象和类型。
var foo = $._data( $('body').get(0), 'events' );
$.each( foo, function(i,o) {
console.log(i); // guide of the event
console.log(o); // the function definition of the event handler
});
我最终做了这个
typeof ($('#mySelector').data('events').click) == "object"
$.data(element, "events")
从未被官方认可。但在jQuery 1.8.0中,该方法通过$._data(element, "events")
被废弃了。 在这里阅读更多信息。 - Anton