Вы можете проверить в обработчике, является ли элемент дочерним по отношению к элементу, которому был делегирован обработчик события;
$(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");