2012-03-29 16 views
8

Wenn Delegieren Ereignisse .on mit, wie richte ich Kind-Elemente:Wie behandelt man ein delegiertes Ereignis nur für untergeordnete Elemente?

ich versucht habe: childSelector =

  • >*
  • >:nth-child(n)

Aber nichts ausgewählt ist, wenn ich mit > starten.

$(selector).on(event, childSelector, handler); 

Manchmal mag ich ein direktes Kind zum Ziel, manchmal weiß ich nicht: (Pseudocode)

var func = function(selector, subSelector) { 
    $(selector).on("click", subSelector, function() { 
     alert("my subSelector is clicked"); 
    }); 
} 

func("#wrapper", "direct-child-selector"); 
func("#wrapper", ".some .other > .selector:first"); 

Das ist, warum ich für einen Wähler bin gefragt und nicht eine Lösung.

+0

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

+0

'@' Andreas: Siehe meine aktualisierte Antwort. – Matt

Antwort

4

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"); 
+0

wow. wusste nicht über 'delicateTarget'. Aber ich habe immer noch ein Problem siehe bearbeitete Frage – andlrc

+0

ok danke für Ihre Hilfe. Es scheint also keinen Selektor zu geben, bei dem Sie sicherstellen können, dass Sie die direkten Kinder auswählen und Platz für die Auswahl von etwas anderem ohne einen Workaround schaffen. – andlrc

+0

Ich glaube, es muss 'this.parentNode' statt' e.parentNode' sein. Vielleicht funktioniert 'e.target.parentNode' auch. –

1

Eine Möglichkeit, nur Delegierten Ereignisse auf direkte Kindern ausgelöst ist einen vollständigen Wähler auf on() zu schaffen, den Teil, der die das übergeordnete Element entspricht:

$(selector).on("event", selector + " > *", handler); 
+0

Wird W3C nicht als etwas definiert, das "mit allen Elementen übereinstimmt"? http://www.w3.org/TR/CSS2/selector.html # pattern-matching – LeeGee

+0

@LeeGee, ja, ist es. Das Koppeln mit einem Kindselektor (z. B. "div> *") erlaubt es, alle direkten Kinder eines gegebenen Satzes von Elementen zu vergleichen. –

0

Alles, was Sie brauchen, ist:

childSelector = "*"; 

wenn es ein Kind des Wählers entsprechen angenommen hat. Es wird nur im Bereich des Selektors gesucht.

+2

Das entspricht allen * Nachkommen *. Ein Element ist ein Kind, wenn es ein ** direkter ** Nachkomme ist. – Matt

1

Das funktionierte für mich.

$('#container').on('click', '> .children', function(){ 
... 
}) 
+0

Weil du den Kindern eine bestimmte Klasse gegeben hast. – LeeGee

Verwandte Themen