如果我附加了一个点击事件处理程序:
$(".selector").bind("click", function () {
// some handler function
});
如何获得对该功能的引用?这不起作用:
var refToFunc = $(".selector").bind("click");
typeof refToFunc === "object"; // I want the function
我认为在这种情况下bind("eventname")
只返回jQuery对象而不是事件处理函数。它必须存储在某个地方。
答案 0 :(得分:6)
非常有趣的问题。您可以像这样检索它:
var refToFunc = $(".selector").data("events")["click"][0].handler;
请注意,我们使用[0]
因为您有一个处理程序数组,以防您绑定多个处理程序。对于其他事件,只需更改为事件名称。
修改强> 通常,您可以使用以下插件获取事件的所选元素的所有处理程序(代码尚未优化):
$.fn.getEventHandlers = function(eventName){
var handlers = [];
this.each(function(){
$.each($(this).data("events")[eventName], function(i, elem){
handlers.push(elem.handler);
});
});
return handlers;
};
如何使用?:
$(".selector").getEventHandlers("click");
它将返回包含所有事件处理程序的函数数组。
对于您的具体问题,您可以使用此插件:
var refToFunc = $(".selector").getEventHandlers("click")[0];
希望这会有所帮助。欢呼声
答案 1 :(得分:5)
事件处理程序保存在数据对象中,可通过data
访问。例如:
$('.selector').data('events').click[0].handler;
这将获得绑定到此函数的click
事件的第一个事件处理函数。
如果您想保留该功能的参考,例如要解除绑定,最好将其存储在变量中或使其成为命名函数。
var handler = function() {
// some content
});
$('.selector').bind('click', handler);
答案 2 :(得分:0)
以下是我最终的功能:
var getEventHandlers = function ($object, eventName) {
var handlers = [],
eventHandlers = $object.data("events")[eventName];
if (eventHandlers && eventHandlers.length > 0) {
for (var i = 0, l = eventHandlers.length; i < l; i++) {
handlers.push(eventHandlers[i].handler);
}
}
return handlers;
},
setEventHandlers = function ($object, eventName, handlers) {
if (handlers && handlers.length > 0) {
for (var i = 0, l = handlers.length; i < l; i++) {
$object.bind(eventName, handlers[i]);
}
}
};