Fare olayı yayılmasını durdur


239

Açısal 2'de fare olaylarının yayılmasını durdurmanın en kolay yolu nedir? Özel bir $eventnesneyi geçip stopPropagation()kendimi aramalı mıyım yoksa başka bir yol var mı. Örneğin Meteor'da falseolay işleyicisinden dönebilirim .

Yanıtlar:


235

Aynı kodu tekrar tekrar kopyalayıp yapıştırmak zorunda kalmadan bunu herhangi bir öğeye eklemek istiyorsanız, bunu yapmak için bir yönerge oluşturabilirsiniz. Aşağıdaki gibi basit:

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

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

Ardından, istediğiniz öğeye ekleyin:

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

5
Benim için çalışmıyor. Tıklama etkinliği durdurulmaz :(
Diallo

9
benim için çalışmıyor, diğer tıklama varsa ... <button click-stop-propagation (click) = "test ($ event)"> test </button>
Bibby Chung

Benim için çalıştı. Açısal
5.2.9'u

1
Farklı bir fare olayı dinlemeniz gerekebilir (örneğin, fareyle üzerine gelme, fare ile oynama).
yohosuff

1
@ yohosuff iyi bir noktaya değiniyor. Bu yöntemi direktife ekleyin:@HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
andreisrob

253

En basit olanı bir olay işleyicide durdurma yayılımını çağırmaktır. $eventAçısal 2'de aynı şekilde çalışır ve devam eden olayı içerir (onun tarafından bir fare tıklaması, fare olayı vb.):

(click)="onEvent($event)"

olay işleyicide, yayılımı durdurabiliriz:

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

2
Özel yönergemde, işe yaramıyor. <button confirmMessage="are you sure?" (click)="delete()">Delete</button>, ve benim direktifimde:, (click)="confirmAction($event)o zaman confirmAction(event) { event.stopPropagation(); };
Saeed Neamati

4
Ayrıca yanlış döndürmeyi deneyin
Joshua Michael Waggoner

eventişleyici işlevinde işlediğiniz stopPropogation()zaman kullanılabilir değil gibi görünüyor . İşaretlemede doğru yapmak zorunda kaldım: `(click) =" foo (); $ event.stopPropogation () "
inorganik

Bu en azından bağlantı elemanına yerleştirildiğinde çalışmaz. Cevap yanlış.
Gölge Sihirbazı Senin için Kulak

143

stopPropagationEtkinliği aramak yayılmayı önler: 

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

İçin preventDefaultsadece getirifalse

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

Kendim denemedim ama github.com/angular/angular/issues/4782 ve github.com/angular/angular/pull/5892/files bunun çalışması gerektiğini gösteriyor. Onlar yok ;gerçi sonunda. Bunu değiştireceğim.
Günter Zöchbauer

1
StopPropagation ile ilgili olayı üst öğelere adım adım atmamaktan değil, varsayılan eylemi önlemekten bahsediyorlar.
Rem

Oh, bu benim kötülerim. Afedersiniz.
Günter Zöchbauer

2
dönüş false<3
Pawel Gorczynski

Yanlış cevapların otomatik upvotes alması şaşırtıcı. Kod çalışmaz.
Gölge Sihirbazı Sizin İçin

35

@AndroidUniversity'den cevaba ekleniyor. Tek bir satırda şöyle yazabilirsiniz:

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

Html
templating

Açısal 5 ile de mükemmel çalışır.
imans77

10

Bir olaya bağlı bir yöntemdeyseniz, false değerini döndürmeniz yeterlidir:

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

1
Bu does Tıklama etkinlikleri için çalışma. En azından Angular2'nin en son sürümünde.
Jon

6
Geri gelen falsearamalar preventDefaultdeğil stopPropagation.
Günter Zöchbauer

Return false çağrısı DOM'da yayılmayı durdurur. Gerçeklerinizi kontrol edin @ GünterZöchbauer ng-kitabında bahsedildi.
moeabdol

3
@moeabdol bir bağlantı en azından iddia ettiğiniz şeyi gösterebilir, ama aslında preventDefaultdenir. github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
Günter Zöchbauer

1
Doğru! @ GünterZöchbauer Bunu açıkladığınız için teşekkür ederiz. Keşke bir bağlantıyı paylaşabilseydim. Nate Murray'in yanlış döndüren "Açısal 4 Üzerine Komple Kitap" adlı kitabındaki tavsiyelerini takip ettim; DOM'da olay yayılımını durdurma işlevinin sonunda. Tam olarak bahsettiğiniz şekilde açıklıyor. Yanlış anlaşılma için üzgünüm.
moeabdol

8

Bu benim için çalıştı:

mycomponent.component.ts:

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

mycomponent.component.html:

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

Bu çözüm açısal 5 benim için çalıştı .. Teşekkürler.
inbha

5

Ben zorunda kaldı stopPropigationve preventDefaultyukarıda oturdu bir akordeon öğesi genişleyen bir düğme önlemek için.

Yani...

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

3

IE (Internet Explorer) için hiçbir şey işe yaramadı. Testçilerim arkasındaki düğmelerdeki açılır pencereyi tıklayarak modalımı kırmayı başardılar. Bu yüzden modal ekran div'ımı tıklatmayı dinledim ve bir pop-up düğmesine tekrar odaklanmayı zorladım.

<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

kullandım

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

kısaca diğer şeyleri / fonksiyon çağrılarını ';' ve $ event.stopPropagation () öğesini ekleyin


2

Bir Açısal 6 uygulamasında yeni kontrol ettim, event.stopPropagation (), $ olayını bile geçmeden bir olay işleyicisinde çalışır

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


doSomething(){
   // write any code here

   event.stopPropagation();
}

1

JavaScript ile href bağlantısını devre dışı bırak

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

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

Angular ile TypeScript'te de nasıl çalışması gerekir (Sürümüm: 4.1.2)

şablon
<a class="list-group-item list-group-item-action" (click)="employeesService.selectEmployeeFromList($event); false" [routerLinkActive]="['active']" [routerLink]="['/employees', 1]">
    RouterLink
</a>
daktilo ile yazılmış yazı
public selectEmployeeFromList(e) {

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

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

    return false;
}

Ancak, routerLink'in yürütülmesini devre dışı bırakmaz!


0

İşlevden sonra false eklenmesi olayın yayılmasını durdurur

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

0

Bu, bir olayın çocuklar tarafından tetiklenmesini önleyerek sorunumu çözdü:

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


0

Bu yönergeyi deneyin

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

kullanım

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

<input 
    type="text" 
    [stopPropagation]="['input', 'click']" />
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.