要回答您的主要问题,不,选择器应该是一个字符串,或者undefined
. 您所看到的是 jQuery 如何尝试猜测您正在使用的调用约定的一个怪癖——稍后会详细介绍。
遗憾的是,没有办法传递 DOM 元素而不是选择器。如果delegate
是您的处理程序绑定到target
的元素,并且是触发事件的元素,jQuery 将始终delegate
使用提供的选择器搜索 的后代,并检查是否target
在匹配的选择中。如果 jQuery 允许以某种方式传递 DOM 节点而不是选择器,那么肯定会有性能优势。
好吧,在使用过程中$('#someEl').on('click', '.clickable', handler)
,您从未选择过匹配的元素.clickable
,jQuery 在那个阶段也不会,所以您没有在那里加倍工作。
您可以.on()
通过多种方式调用,特别是因为有多个可选参数(选择器、数据)。
当您调用.on(type, notAString, handler)
jQuery 时,假定您使用的是调用约定:.on(type, data, handler)
- 它转换为.on(type, undefined, data, handler)
.
这是您建议的调用的演示:http:
//jsfiddle.net/BGSacho/HJLXs/1/
HTML:
<div id="someEl">
<div id="someNode" class="clickable">Click me!</div>
</div>
JavaScript:
$(document).ready(function () {
function display(event) {
console.log("event.currentTarget", event.currentTarget);
console.log("event.delegateTarget:", event.delegateTarget)
console.log("event.data:", event.data);
}
$('#someEl').on('click', ".clickable", function (event) {
console.log("I am .on(type, selector, fn) - my currentTarget should be .clickable and my delegateTarget should be #somEl - this demonstrates that jQuery is using the event delegation mechanism. I have no data bound to my event.");
display(event);
});
$('#someEl').on('click', document.getElementById('someNode'), function (event) {
console.log("I'm .on(type, data, handler) - my currentTarget should be #someEl because I'm not using a delegation mechanism. I also have some data bound.")
display(event);
});
$('#someEl').on('click', $('#someNode'), function (event) {
console.log("I'm still .on(type, data, handler)");
display(event);
});
});
它们似乎都可以工作,因为您没有在处理代码中使用this
(aka event.currentTarget
)。我不确定为什么使用 jQuery 对象和 DOM 节点会得到不同的结果。