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

tra*_*vis 6 javascript jquery

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

$(".selector").bind("click", function () {
  // some handler function
});
Run Code Online (Sandbox Code Playgroud)

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

var refToFunc = $(".selector").bind("click");
typeof refToFunc === "object";  // I want the function
Run Code Online (Sandbox Code Playgroud)

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

Edg*_*ado 6

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

var refToFunc = $(".selector").data("events")["click"][0].handler;
Run Code Online (Sandbox Code Playgroud)

请注意,我们使用的[0]是因为您有一个处理程序数组,以防您绑定多个处理程序.对于其他事件,只需更改为事件名称.

编辑 通常,您可以使用以下插件获取事件的所选元素的所有处理程序(代码尚未优化):

$.fn.getEventHandlers = function(eventName){
  var handlers = [];
  this.each(function(){
     $.each($(this).data("events")[eventName], function(i, elem){
         handlers.push(elem.handler);    
     });     
  });
  return handlers;
};
Run Code Online (Sandbox Code Playgroud)

如何使用它?:

$(".selector").getEventHandlers("click");
Run Code Online (Sandbox Code Playgroud)

它将返回包含所有事件处理程序的函数数组.

对于您的具体问题,您可以像这样使用此插件:

var refToFunc = $(".selector").getEventHandlers("click")[0];
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.干杯


lon*_*day 5

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

$('.selector').data('events').click[0].handler;
Run Code Online (Sandbox Code Playgroud)

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


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

var handler = function() {
    // some content
});

$('.selector').bind('click', handler);
Run Code Online (Sandbox Code Playgroud)