jQuery委托对象而不是选择器作为第一个参数

时间:2011-07-10 21:00:07

标签: javascript jquery events

是否可以传递一个对象而不是一个选择器作为jQuery委托的第一个参数?

var ancestor = $('ancestor'),
    children = ancestor.find('a');

ancestor.delegate(children, eventType, handler);

而不是常规:

ancestor.delegate('a', eventType, handler);

修改

动机:

var children = $('a[href^="#"]').map($.proxy(function(i, current) {

    var href = $(current).attr('href');

    if(href.length > 1 && givenElement.find(href).length === 1) return $(current);
},
this));

$(document).delegate(children, eventType, handler);

我只想将散列链接到任何元素的锚元素委托为给定元素的子元素。基本上我只想做一些你不能只用选择器做的事情。

1 个答案:

答案 0 :(得分:2)

您可以随时设置委派,然后在事件处理程序中执行谓词

ancestor.delegate('a[href^="#"]', 'click', function(ev) {
  if (someElement.find($(ev.target).attr('href')).length > 0) {
    // do whatever with ev.target
  }
});

如果您想避免在处理程序中执行jQuery DOM搜索的运行时价格,您可以预先标记所有“好”标记:

$('a[href^="#"]').each(function() {
  if (someElement.find($(this).attr('href')).length > 0)
    $(this).addClass("special");
});

然后你的委托事件处理程序可以检查

  if ($(ev.target).hasClass('special')) {
    // do stuff
  }

在任何情况下都能表现良好,不会出现问题。

你必须从“.delegate()”选择器开始工作的原因是它的实现方式。事件处理程序总是执行以下操作:

  function genericDelegateHandler(ev) {
    if ($(ev.target).is(theSelector)) {
      userHandler.call(this, ev);
    }
  }

现在,显然可以尝试比较你设置没有选择器的委托时的实际元素,但事实并非如此。

编辑 - @DADU(OP)正确地指出,如果你用类名来标记所有东西,那么你甚至不需要一个花哨的事件处理程序来测试;普通的“.delegate()”会做到这一点。 : - )