Stoppen Sie die Weitergabe von Mausereignissen


238

Was ist der einfachste Weg, um die Ausbreitung von Mausereignissen in Angular 2 zu stoppen? Sollte ich ein spezielles $eventObjekt passieren und stopPropagation()mich selbst anrufen oder gibt es einen anderen Weg. Zum Beispiel kann ich in Meteor einfach falsevom Ereignishandler zurückkehren.

Antworten:


234

Wenn Sie dies zu beliebigen Elementen hinzufügen möchten, ohne denselben Code immer wieder kopieren / einfügen zu müssen, können Sie eine Anweisung dazu erstellen. Es ist so einfach wie unten:

import {Directive, HostListener} from "@angular/core";

@Directive({
    selector: "[click-stop-propagation]"
})
export class ClickStopPropagation
{
    @HostListener("click", ["$event"])
    public onClick(event: any): void
    {
        event.stopPropagation();
    }
}

Fügen Sie es dann einfach zu dem Element hinzu, für das Sie es möchten:

<div click-stop-propagation>Stop Propagation</div>

5
Es funktioniert nicht bei mir. Das Klickereignis wird nicht gestoppt :(
Diallo

9
funktioniert bei mir nicht, wenn ich den anderen Klick habe ... <button click-stop-propagation (click) = "test ($ event)"> test </ button>
Bibby Chung

Hat für mich gearbeitet. Verwenden von Angular 5.2.9
Yarz-Tech

1
Möglicherweise müssen Sie auf ein anderes Mausereignis warten (z. B. Mousedown, Mouseup).
Yohosuff

1
@yohosuff macht einen guten Punkt. Fügen Sie diese Methode der Direktive hinzu: @HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
andreisrob

252

Am einfachsten ist es, die Stop-Propagierung für einen Ereignishandler aufzurufen. $eventfunktioniert in Angular 2 genauso und enthält das laufende Ereignis (durch einen Mausklick, ein Mausereignis usw.):

(click)="onEvent($event)"

Auf dem Event-Handler können wir dort die Weitergabe stoppen:

onEvent(event) {
   event.stopPropagation();
}

2
In meiner benutzerdefinierten Direktive funktioniert es nicht. <button confirmMessage="are you sure?" (click)="delete()">Delete</button>und in meiner Anweisung: (click)="confirmAction($event)dann confirmAction(event) { event.stopPropagation(); };
Saeed Neamati

4
Versuchen Sie auch falsch zurückzugeben
Joshua Michael Waggoner

Es scheint, dass zu dem Zeitpunkt, den Sie eventin der Handler-Funktion behandeln, stopPropogation()nicht verfügbar ist. Ich musste es richtig im Markup machen: `(click) =" foo (); $ event.stopPropogation () "
inorganik

Dies funktioniert nicht, zumindest nicht, wenn es im Ankerelement platziert wird. Die Antwort ist falsch.
Schatten-Assistent ist Ohr für Sie

143

Das Aufrufen stopPropagationdes Ereignisses verhindert die Weitergabe: 

(event)="doSomething($event); $event.stopPropagation()"

Für preventDefaulteinfach zurückfalse

(event)="doSomething($event); false"

Ich habe es nicht selbst versucht, aber github.com/angular/angular/issues/4782 und github.com/angular/angular/pull/5892/files geben an, dass es funktionieren sollte. Das haben sie aber ;am Ende nicht. Ich werde das ändern.
Günter Zöchbauer

1
Sie sprechen davon, Standardaktionen zu verhindern und nicht das Ereignis durch übergeordnete Elemente zu verschieben, worum es bei stopPropagation geht.
Rem

Oh, das ist mein schlechtes. Es tut uns leid.
Günter Zöchbauer

2
Rückkehr false<3
Pawel Gorczynski

Erstaunlich, wie falsche Antworten automatische Upvotes erhalten. Der Code funktioniert einfach nicht.
Schatten-Assistent ist Ohr für Sie

35

Hinzufügen zur Antwort von @AndroidUniversity. In einer einzigen Zeile können Sie es so schreiben:

<component (click)="$event.stopPropagation()"></component>

Es sollte sich nicht so sehr von Version zu Version ändern, da sie versuchen, den HTML-
Vorlagenstandard beizubehalten

Funktioniert auch perfekt mit Winkel 5.
Imans77

10

Wenn Sie sich in einer an ein Ereignis gebundenen Methode befinden, geben Sie einfach false zurück:

@Component({
  (...)
  template: `
    <a href="https://stackoverflow.com/test.html" (click)="doSomething()">Test</a>
  `
})
export class MyComp {
  doSomething() {
    (...)
    return false;
  }
}

1
Es funktioniert für Klickereignisse. Zumindest in der neuesten Version von Angular2.
Jon

6
Wiederkehrende falseAnrufe preventDefaultnicht stopPropagation.
Günter Zöchbauer

Wenn Sie return false aufrufen, wird die Weitergabe im DOM gestoppt. Überprüfen Sie Ihre Fakten @ GünterZöchbauer Es wird im ng-Buch erwähnt.
Moeabdol

3
@moeabdol ein Link könnte zumindest zeigen, was Sie behaupten, wird aber tatsächlich preventDefaultgenannt. github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
Günter Zöchbauer

1
Richtig! @ GünterZöchbauer Vielen Dank für die Klarstellung. Ich wünschte, ich könnte einen Link teilen. Ich folgte Nate Murrays Rat in seinem Buch "ng-book The Complete Book on Angular 4", falsch zurückzugeben; am Ende einer Funktion zum Stoppen der Ereignisausbreitung im DOM. Er beschreibt es genau so, wie Sie es erwähnt haben. Entschuldigung für das Missverständnis.
Moeabdol

8

Das hat bei mir funktioniert:

mycomponent.component.ts:

action(event): void {
  event.stopPropagation();
}

mycomponent.component.html:

<button mat-icon-button (click)="action($event);false">Click me !<button/>

Diese Lösung hat bei mir in Winkel 5 funktioniert. Danke.
Inbha

5

Ich musste stopPropigationund preventDefaultum zu verhindern, dass ein Knopf einen Akkordeongegenstand erweitert, über dem er saß.

So...

@Component({
  template: `
    <button (click)="doSomething($event); false">Test</button>
  `
})
export class MyComponent {
  doSomething(e) {
    e.stopPropagation();
    // do other stuff...
  }
}

3

Für IE (Internet Explorer) hat nichts funktioniert. Meine Tester konnten mein Modal brechen, indem sie auf die Schaltflächen dahinter im Popup-Fenster klickten. Also habe ich auf einen Klick auf mein modales Bildschirm-Div gewartet und mich erneut auf eine Popup-Schaltfläche konzentriert.

<div class="modal-backscreen" (click)="modalOutsideClick($event)">
</div>


modalOutsideClick(event: any) {
   event.preventDefault()
   // handle IE click-through modal bug
   event.stopPropagation()
   setTimeout(() => {
      this.renderer.invokeElementMethod(this.myModal.nativeElement, 'focus')
   }, 100)
} 

3

ich benutzte

<... (click)="..;..; ..someOtherFunctions(mybesomevalue); $event.stopPropagation();" ...>...

Kurz gesagt, trennen Sie einfach andere Dinge / Funktionsaufrufe mit ';' und füge $ event.stopPropagation () hinzu


2

Ich habe gerade eine Angular 6-Anwendung eingecheckt. Event.stopPropagation () funktioniert mit einem Ereignishandler, ohne $ event zu übergeben

(click)="doSomething()"  // does not require to pass $event


doSomething(){
   // write any code here

   event.stopPropagation();
}

1

Deaktivieren Sie den href-Link mit JavaScript

<a href="#" onclick="return yes_js_login();">link</a>

yes_js_login = function() {
     // Your code here
     return false;
}

Wie es auch in TypeScript mit Angular funktionieren sollte (Meine Version: 4.1.2)

Vorlage
<a class="list-group-item list-group-item-action" (click)="employeesService.selectEmployeeFromList($event); false" [routerLinkActive]="['active']" [routerLink]="['/employees', 1]">
    RouterLink
</a>
Typoskript
public selectEmployeeFromList(e) {

    e.stopPropagation();
    e.preventDefault();

    console.log("This onClick method should prevent routerLink from executing.");

    return false;
}

Die Ausführung von routerLink wird jedoch nicht deaktiviert!


0

Durch Hinzufügen der Funktion false after wird die Ereignisausbreitung gestoppt

<a (click)="foo(); false">click with stop propagation</a>

0

Dies löste mein Problem, indem ich verhinderte, dass ein Ereignis von einem Kind ausgelöst wurde:

doSmth(){
  // what ever
}
        <div (click)="doSmth()">
            <div (click)="$event.stopPropagation()">
                <my-component></my-component>
            </div>
        </div>


0

Versuchen Sie diese Anweisung

@Directive({
    selector: '[stopPropagation]'
})
export class StopPropagationDirective implements OnInit, OnDestroy {
    @Input()
    private stopPropagation: string | string[];

    get element(): HTMLElement {
        return this.elementRef.nativeElement;
    }

    get events(): string[] {
        if (typeof this.stopPropagation === 'string') {
            return [this.stopPropagation];
        }
        return this.stopPropagation;
    }

    constructor(
        private elementRef: ElementRef
    ) { }

    onEvent = (event: Event) => {
        event.stopPropagation();
    }

    ngOnInit() {
        for (const event of this.events) {
            this.element.addEventListener(event, this.onEvent);
        }
    }

    ngOnDestroy() {
        for (const event of this.events) {
            this.element.removeEventListener(event, this.onEvent);
        }
    }
}

Verwendung

<input 
    type="text" 
    stopPropagation="input" />

<input 
    type="text" 
    [stopPropagation]="['input', 'click']" />
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.