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

是否可以传递一个对象而不是一个选择器作为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);

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

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

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()”会做到这一点. 🙂

点赞