一旦在jQuery中绑定了一个事件,你如何获得对事件处理函数的引用?

如果我附加了一个click事件处理程序:

$(".selector").bind("click", function () { // some handler function }); 

如何获得该function的参考? 这不起作用:

 var refToFunc = $(".selector").bind("click"); typeof refToFunc === "object"; // I want the function 

我认为在这种情况下bind("eventname")只返回jQuery对象而不是事件处理函数。 它必须存储在某个地方。

非常有趣的问题。 您可以像这样检索它:

 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]; 

希望这可以帮助。 干杯

事件处理程序保存在数据对象中,可通过data访问。 例如:

 $('.selector').data('events').click[0].handler; 

这将获得绑定到此函数的click事件的第一个事件处理函数。


如果你想保留函数的引用,例如解除绑定,最好将它存储在变量中或使其成为命名函数。

 var handler = function() { // some content }); $('.selector').bind('click', handler); 

以下是我最终得到的function:

 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]); } } };