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