Hentikan propagasi acara mouse

239

Apa cara termudah untuk menghentikan penyebaran acara mouse di Angular 2? Haruskah saya melewati $eventobjek khusus dan memanggil stopPropagation()diri sendiri atau ada cara lain. Sebagai contoh di Meteor saya hanya bisa kembali falsedari event handler.

Rem
sumber

Jawaban:

235

Jika Anda ingin dapat menambahkan ini ke elemen apa pun tanpa harus menyalin / menempel kode yang sama berulang-ulang, Anda dapat membuat arahan untuk melakukan ini. Sesederhana seperti di bawah ini:

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

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

Kemudian tambahkan saja ke elemen yang Anda inginkan:

<div click-stop-propagation>Stop Propagation</div>
dnc253
sumber
5
Itu tidak bekerja untuk saya. Acara klik tidak dihentikan :(
Diallo
9
tidak berfungsi untuk saya, jika saya memiliki klik lain ... <tombol klik-hentikan propagasi (klik) = "tes ($ event)"> test </button>
Bibby Chung
Bekerja untukku. Menggunakan Angular 5.2.9
yarz-tech
1
Anda mungkin perlu mendengarkan acara mouse yang berbeda (mis. Mousedown, mouseup).
yohosuff
1
@ yohosuff membuat poin yang bagus. Tambahkan metode ini ke arahan: @HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
andreisrob
253

Yang paling sederhana adalah memanggil propagasi stop pada pengendali event. $eventberfungsi sama di Angular 2, dan berisi acara yang sedang berlangsung (dengan klik mouse, acara mouse, dll.):

(click)="onEvent($event)"

pada pengendali acara, kita dapat menghentikan propagasi di sana:

onEvent(event) {
   event.stopPropagation();
}
Universitas Angular
sumber
2
Dalam arahan khusus saya, itu tidak berfungsi. <button confirmMessage="are you sure?" (click)="delete()">Delete</button>, dan dalam arahan saya:, (click)="confirmAction($event)lalu confirmAction(event) { event.stopPropagation(); };
Saeed Neamati
4
Coba kembalikan salah juga
Joshua Michael Wagoner
Tampaknya pada saat Anda menangani eventfungsi handler stopPropogation()tidak tersedia. Saya harus melakukannya tepat di markup: `(klik) =" foo (); $ event.stopPropogation () "
inorganik
Ini tidak berfungsi, setidaknya tidak ketika ditempatkan di elemen jangkar. Jawabannya salah.
Shadow Wizard adalah Ear For You
143

Memanggil stopPropagationacara mencegah propagasi: 

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

Untuk preventDefaultkembali sajafalse

(event)="doSomething($event); false"
Günter Zöchbauer
sumber
Saya belum mencobanya sendiri tetapi github.com/angular/angular/issues/4782 dan github.com/angular/angular/pull/5892/files menunjukkan itu harus berfungsi. Mereka tidak memiliki ;pada akhirnya. Saya akan mengubahnya.
Günter Zöchbauer
1
Mereka berbicara tentang mencegah tindakan default, bukan melangkah peristiwa melalui elemen induk apa yang dimaksud dengan stopPropagation.
Rem
Oh, itu salahku. Maaf.
Günter Zöchbauer
2
kembali false<3
Pawel Gorczynski
Menakjubkan betapa salahnya jawaban mendapatkan auto upvotes. Kode tidak berfungsi.
Shadow Wizard adalah Ear For You
35

Menambah jawaban dari @AndroidUniversity. Dalam satu baris Anda dapat menulis seperti ini:

<component (click)="$event.stopPropagation()"></component>
dinigo
sumber
Seharusnya tidak banyak berubah dari versi ke versi karena mereka mencoba untuk menjaga standar
templat
Bekerja dengan sempurna dengan sudut 5 juga.
imans77
10

Jika Anda menggunakan metode yang terikat pada suatu acara, kembalikan false:

@Component({
  (...)
  template: `
    <a href="https://stackoverflow.com/test.html" (click)="doSomething()">Test</a>
  `
})
export class MyComp {
  doSomething() {
    (...)
    return false;
  }
}
Thierry Templier
sumber
1
Ini tidak bekerja untuk acara kali klik. Setidaknya dalam versi terbaru Angular2.
Jon
6
falsePanggilan balik preventDefaulttidak stopPropagation.
Günter Zöchbauer
Memanggil return false tidak menghentikan propagasi di DOM. Periksa fakta Anda @ GünterZöchbauer Disebutkan di buku-ng.
moeabdol
3
@moeabdol tautan setidaknya bisa menunjukkan apa yang Anda klaim, tetapi sebenarnya preventDefaultdisebut. github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
Günter Zöchbauer
1
Benar! @ GünterZöchbauer Terima kasih telah mengklarifikasi ini. Saya berharap bisa membagikan tautan. Saya mengikuti saran Nate Murray dalam bukunya "ng-book The Complete Book on Angular 4" untuk mengembalikan yang salah; di akhir fungsi untuk menghentikan propagasi acara di DOM. Dia menggambarkannya persis seperti yang Anda sebutkan. Maaf atas kesalahpahaman ini.
moeabdol
8

Ini bekerja untuk saya:

mycomponent.component.ts:

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

mycomponent.component.html:

<button mat-icon-button (click)="action($event);false">Click me !<button/>
Brahim JDIDOU
sumber
Solusi ini bekerja untuk saya dalam sudut 5 .. Terima kasih.
inbha
5

Saya harus stopPropigationdanpreventDefault untuk mencegah tombol memperluas item akordeon yang ada di atasnya.

Begitu...

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

Tidak ada yang berfungsi untuk IE (Internet Explorer). Penguji saya dapat merusak modal saya dengan mengklik jendela popup pada tombol di belakangnya. Jadi, saya mendengarkan klik pada div layar modal saya dan memaksa memfokuskan kembali pada tombol sembulan.

<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)
} 
PatrickW
sumber
3

Saya menggunakan

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

singkatnya pisahkan panggilan fungsi / fungsi lain dengan ';' dan tambahkan $ event.stopPropagation ()

Ray Dragon
sumber
2

Saya baru saja memeriksa aplikasi Angular 6, event.stopPropagation () berfungsi pada event handler tanpa melewati $ event

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


doSomething(){
   // write any code here

   event.stopPropagation();
}
Dipendu Paul
sumber
1

Nonaktifkan tautan href dengan JavaScript

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

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

Bagaimana seharusnya juga bekerja di TypeScript dengan Angular (Versi Saya: 4.1.2)

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

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

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

    return false;
}

Tetapi itu tidak menonaktifkan eksekusi dari routerLink!

Javan R.
sumber
0

Menambahkan false setelah fungsi akan menghentikan propagasi acara

<a (click)="foo(); false">click with stop propagation</a>
Fabian Rios
sumber
0

Ini menyelesaikan masalah saya, dari preventign bahwa suatu peristiwa dipecat oleh anak-anak:

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

JulianRot
sumber
0

Coba petunjuk ini

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

Pemakaian

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

<input 
    type="text" 
    [stopPropagation]="['input', 'click']" />
David Alsh
sumber