e.stopPropagation () funktioniert nicht wie erwartet?

8

Ich habe eine einfache Tabelle :

Der TR hat <tr onclick='alert("row");'>

Und der Knopf hat:

%Vor%

Allerdings - Obwohl ich e.stopPropagation(); geschrieben habe, warnt es immer noch: "row, button".

Nun weiß ich, dass der Event-Handler an die body angehängt ist und der Selektor dagegen angeklickt ist (der Klick beginnt an der Schaltfläche und bewegt sich zum Body, genau wie $.live , aber gegen document ...).

Aber die Überprüfung sollte für den button Klick und nicht für den TR Klick sein.

Es scheint so, als würde ich während des Klickens auf das "body" (weil ich den Event-Handler angehängt habe) und auf dem Weg zum Body propagieren und den Klick auf% aktivieren co_de%.

Was ist hier los? Wie kann ich meinen Code behalten (an Körper anhängen) und habe immer noch nur Alarm von "Knopf".

P. s.

Ich weiß, ich kann einfach tun:

%Vor%

aber ich möchte wissen, warum mein aktueller (!) Code nicht funktioniert.

    
Royi Namir 10.06.2013, 10:32
quelle

3 Antworten

11

Das Problem besteht darin, dass Sie den Ereignishandler mit body verknüpfen, selbst wenn er an das Element .b delegiert wird. Dieser Ereignishandler wird nur aufgerufen, nachdem der Ereignishandler tr aufgerufen wurde. Daher ist es zu spät, die Weitergabe zu stoppen.

Da Sie vermutlich mit dynamisch hinzugefügten Elementen arbeiten und den Event-Handler nicht einfach an td binden können, kann ich Ihnen folgendes vorschlagen:

%Vor%

Demonstration

    
Denys Séguret 10.06.2013, 10:39
quelle
5
  

... aber ich möchte wissen, warum mein aktueller (!) Code nicht funktioniert.

Von jQuery-Dokumenten aus auf event.stopPropagation mit Ereignisdelegierung:

  

Da die .live () -Methode Ereignisse verarbeitet, nachdem sie weitergegeben wurden   Im oberen Teil des Dokuments ist es nicht möglich, die Verbreitung von zu stoppen   Live-Events. In ähnlicher Weise werden Ereignisse, die von .delegate () behandelt werden, weitergegeben   zu den Elementen, an die sie delegiert sind; Ereignishandler gebunden    Alle Elemente darunter im DOM-Baum wurden bereits ausgeführt   zu dem Zeitpunkt, zu dem der delegierte Ereignishandler aufgerufen wird. Diese Handler,   kann daher verhindern, dass der delegierte Handler ausgelöst wird   Aufruf event.stopPropagation () oder Rückgabe false.

live und delegate sind jetzt on , dies gilt also.

    
elclanrs 10.06.2013 10:35
quelle
0

Vielleicht fügen Sie einfach die Ereignisbehandlung auf der Schaltfläche an (auch wenn inline javascript an <tr> angehängt ist) -

%Vor%

ODER - Anstatt das inline -Ereignis in <tr> anzugeben, können Sie

angeben %Vor%     
Ishank Dubey 10.06.2013 10:53
quelle

Tags und Links