javascript - jQuery 委托(delegate)对象而不是选择器作为第一个参数

标签 javascript jquery events

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

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

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

最佳答案

您总是可以只设置委托(delegate),然后在事件处理程序内部执行谓词:

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

然后您委托(delegate)的事件处理程序可以检查

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

在任何情况下都不会出现问题。

您必须从“.delegate()”选择器开始工作的原因是它的实现方式。事件处理程序总是做类似的事情:

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

现在,显然它可以还尝试比较实际元素,以防您设置一个没有选择器的委托(delegate),但事实并非如此。

edit — @DADU(OP)正确地指出,如果您不厌其烦地用类名标记所有内容,那么您甚至不需要一个花哨的事件处理程序来测试;一个普通的“.delegate()”就可以了。 :-)

关于javascript - jQuery 委托(delegate)对象而不是选择器作为第一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6643638/

相关文章:

javascript - 使用一个链接 Javascript 切换多个 div

javascript - 如何向动态创建的列表项添加复选框?

javascript - 在 Wirecloud 中使用 jQuery 给出 "Uncaught ReferenceError: jQuery is not defined"

events - Vim 中 MenuPopup 的 autocmd 事件

javascript - 函数不会在页面加载时运行

javascript - 访问对象内对象的键和值

javascript - 使用 JS 从 PHP 导入图表列的值

javascript - jQuery:过滤/获取/选择 DOM 元素的唯一内容

javascript - 无法使用 jQuery 在 Chrome 中将复选框设置为已选中

android - 按钮setonclicklistener错误