Sie konnte Prüfung innerhalb des Handler, ob das Elements ist ein Kind des Elements, an das der Ereignishandler delegiert wurde;
$(selector).on("event", '*', function (e) {
if (e.target.parentNode === e.delegateTarget) {
// Woo!
}
});
Siehe e.delegateTarget
. Es ist erwähnenswert, dass e.delegateTarget
in jQuery 1.7 eingeführt wurde, so dass ältere Versionen nicht funktionieren.
In Bezug auf Ihre zweite Bearbeitung, in seiner aktuellen Form sind die Selektoren mehrdeutig; Es gibt keine Möglichkeit für Sie, in Code und in seiner aktuellen Form festzustellen, ob der übergebene Selektor ein Nur-Kind-Selektor sein soll. Sie können entweder einen anderen Parameter eingeben, um anzugeben, ob es sich um einen Nur-Kind-Selektor handeln soll, oder am Anfang des Selektors eine >
hinzufügen (z. B.) und prüfen, ob dies der Fall ist;
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 */);
Oder:
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");
Ihre Änderung macht keinen Sinn. Ein * Kind * ist ein Element, das ein unmittelbarer Nachkomme des Elements ist, z. 'child.parentNode === Elternteil'. Ein "indirektes Kind *" ist lediglich ein Nachfahre; z.B. 'abcendant.parentNode.parentNode.parentNode (etc) === Vorfahre '. Aufgrund der Art und Weise, wie Ereignissprudeln funktioniert, können Sie, wenn der delegierte Handler ein Ereignis empfängt, * garantieren *, dass das Ziel des Ereignisses ein Nachkomme war. – Matt
'@' Andreas: Siehe meine aktualisierte Antwort. – Matt