Ferma la propagazione degli eventi del mouse


239

Qual è il modo più semplice per interrompere la propagazione degli eventi del mouse in Angular 2? Devo passare un $eventoggetto speciale e chiamare stopPropagation()me stesso o c'è un altro modo. Ad esempio in Meteor posso semplicemente tornare falsedal gestore dell'evento.

Risposte:


235

Se vuoi essere in grado di aggiungere questo a qualsiasi elemento senza dover copiare / incollare lo stesso codice più e più volte, puoi fare una direttiva per farlo. È semplice come di seguito:

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

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

Quindi aggiungilo all'elemento su cui lo desideri:

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

5
Per me non funziona. L'evento click non viene interrotto :(
Diallo

9
non funziona per me, se ho l'altro clic ... <button click-stop-propagation (click) = "test ($ event)"> test </button>
Bibby Chung

Ha funzionato per me. Usando Angular 5.2.9
yarz-tech

1
Potrebbe essere necessario ascoltare un evento del mouse diverso (ad es. Mousedown, mouseup).
Yohosuff,

1
@yohosuff ha ragione. Aggiungi questo metodo alla direttiva: @HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
andreisrob

253

Il più semplice è chiamare la propagazione di stop su un gestore di eventi. $eventfunziona allo stesso modo in Angular 2 e contiene l'evento in corso (tramite esso un clic del mouse, un evento del mouse, ecc.):

(click)="onEvent($event)"

sul gestore eventi, possiamo lì interrompere la propagazione:

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

2
Nella mia direttiva personalizzata, non funziona. <button confirmMessage="are you sure?" (click)="delete()">Delete</button>, e nella mia direttiva:, (click)="confirmAction($event)quindi confirmAction(event) { event.stopPropagation(); };
Saeed Neamati,

4
Prova anche a restituire false
Joshua Michael Wagoner,

sembra che al momento eventin cui gestisci la funzione gestore stopPropogation()non è disponibile. Ho dovuto farlo nel markup: `(click) =" foo (); $ event.stopPropogation () "
inorganik

Questo non funziona, almeno non quando viene inserito nell'elemento di ancoraggio. La risposta è sbagliata
Shadow Wizard is Ear For You,

143

La chiamata stopPropagationall'evento impedisce la propagazione: 

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

Per preventDefaultappena ritornofalse

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

Non l'ho provato da solo, ma github.com/angular/angular/issues/4782 e github.com/angular/angular/pull/5892/files indicano che dovrebbe funzionare. Alla ;fine però non hanno . Lo cambierò.
Günter Zöchbauer,

1
Stanno parlando di prevenire l'azione di default, non di far passare l'evento attraverso elementi genitori di cosa parla stopPropagation.
Rem

Oh, questo è il mio male. Scusate.
Günter Zöchbauer,

2
ritorno false<3
Pawel Gorczynski,

Incredibile come risposte errate ottengano voti automatici. Il codice semplicemente non funziona.
Shadow Wizard is Ear For You,

35

Aggiunta alla risposta da @AndroidUniversity. In una sola riga puoi scriverlo in questo modo:

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

Non dovrebbe cambiare molto da una versione all'altra poiché provano a mantenere lo standard di template HTML :)
dinigo

Funziona perfettamente anche con Angular 5.
imans77,

10

Se si utilizza un metodo associato a un evento, è sufficiente restituire false:

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

1
Si fa il lavoro per gli eventi click. Almeno nell'ultima versione di Angular2.
Jon,

6
Tornando falsechiamate preventDefaultnon stopPropagation.
Günter Zöchbauer,

La chiamata return false interrompe la propagazione nel DOM. Controlla i tuoi fatti @ GünterZöchbauer È menzionato nel ng-book.
Moeabdol,

3
@moeabdol un link potrebbe almeno dimostrare ciò che rivendichi, ma in realtà preventDefaultviene chiamato. github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
Günter Zöchbauer

1
Corretta! @ GünterZöchbauer Grazie per aver chiarito questo. Vorrei poter condividere un link. Ho seguito il consiglio di Nate Murray nel suo libro "ng-book The Complete Book on Angular 4" di restituire false; al termine di una funzione per arrestare la propagazione degli eventi nel DOM. Lo descrive esattamente come hai menzionato. Scusa per il fraintendimento.
Moeabdol,

8

Questo ha funzionato per me:

mycomponent.component.ts:

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

mycomponent.component.html:

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

Questa soluzione ha funzionato per me in Angular 5 .. Grazie.
entro il

5

Ho dovuto stopPropigatione preventDefaultper evitare che un bottone espandesse un oggetto a fisarmonica che si trovava sopra.

Così...

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

3

Niente ha funzionato per IE (Internet Explorer). I miei tester sono stati in grado di rompere il mio modale facendo clic sulla finestra popup sui pulsanti dietro di essa. Quindi, ho ascoltato un clic sul mio div dello schermo modale e ho forzato la messa a fuoco su un pulsante popup.

<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

ero solito

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

in breve, basta separare altre cose / chiamate di funzione con ';' e aggiungi $ event.stopPropagation ()


2

Ho appena registrato in un'applicazione Angular 6, event.stopPropagation () funziona su un gestore di eventi senza nemmeno passare $ event

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


doSomething(){
   // write any code here

   event.stopPropagation();
}

1

Disabilita il collegamento href con JavaScript

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

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

Come dovrebbe funzionare anche in TypeScript con Angular (My Version: 4.1.2)

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

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

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

    return false;
}

Ma non disabilita l'esecuzione di routerLink!


0

L'aggiunta di false after function interromperà la propagazione degli eventi

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

0

Ciò ha risolto il mio problema, da prevenzione che un evento viene generato da un bambino:

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


0

Prova questa direttiva

@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);
        }
    }
}

uso

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

<input 
    type="text" 
    [stopPropagation]="['input', 'click']" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.