是否可以传递一个对象而不是一个选择器作为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);
我只想将散列链接到任何元素的锚元素委托为给定元素的子元素。基本上我只想做一些你不能只用选择器做的事情。
答案 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()”会做到这一点。 : - )