您可以在處理程序是否在元素中檢查是事件處理程序委託給的元素的子元素;
$(selector).on("event", '*', function (e) {
if (e.target.parentNode === e.delegateTarget) {
// Woo!
}
});
請參閱e.delegateTarget
。值得注意的是,e.delegateTarget
是在jQuery 1.7中引入的,因此在舊版本中不起作用。
關於您的第二次編輯,在它的當前形式中,選擇器是不明確的;您無法以代碼和當前形式檢測傳遞的選擇器是否僅作爲子選擇器。您可以引入另一個參數來指示它是打算成爲僅子選擇器,還是將>
添加到選擇器的開頭(例如)並檢查它;
var func = function(selector, subSelector, isChild) {
$(selector).on("click", subSelector, function(e) {
if (isChild && e.parentNode == e.delegateTarget || !isChild) {
alert("my subSelector is clicked");
}
});
}
func("#wrapper", "direct-child-selector", true);
func("#wrapper", ".some .other > .selector:first" /* , `false` is optional */);
或者:
var func = function(selector, subSelector) {
if (subSelector.charAt(0) === '>') {
subSelector = selector + subSelector;
}
$(selector).on("click", subSelector, function(e) {
alert("my subSelector is clicked");
});
}
func("#wrapper", "> direct-child-selector");
func("#wrapper", ".some .other > .selector:first");
您的編輯沒有任何意義。 A * child *是元素的直接後代元素,例如'child.parentNode ===父'。 「間接孩子」只是一個後代;例如'descendant.parentNode.parentNode.parentNode(etc)=== ancestor'。由於事件冒泡如何起作用,如果委託處理程序接收到事件,則可以*保證*事件的目標是後代。 – Matt 2012-03-29 09:50:55
'@'安德里亞斯:查看我更新的答案。 – Matt 2012-03-29 10:44:42