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.

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>

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

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"

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>

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

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/>

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...
  }
}

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

3

Saya menggunakan

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

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


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

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!


0

Menambahkan false setelah fungsi akan menghentikan propagasi acara

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

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>


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']" />
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.