web-dev-qa-db-ja.com

マウスイベントの伝播を停止する

Angular 2でマウスイベントの伝播を止める最も簡単な方法は何ですか?私は特別な$eventオブジェクトを渡してstopPropagation()を自分で呼ぶべきであるか他の方法があります。例えばMeteorでは、イベントハンドラからfalseを返すことができます。

189
Rem

何度も何度も同じコードをコピー&ペーストしなくても、これを任意の要素に追加できるようにしたい場合は、これを行うためのディレクティブを作成できます。それは以下と同じくらい簡単です:

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

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

それからそれを欲しい要素に追加するだけです:

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

最も簡単な方法は、イベントハンドラで伝播停止を呼び出すことです。 $eventはAngular 2でも同じように機能し、進行中のイベント(マウスクリック、マウスイベントなど)を含みます。

(click)="onEvent($event)"

イベントハンドラでは、伝播を止めることができます。

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

イベントでstopPropagationを呼び出すと、伝播が阻止されます。

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

preventDefaultの場合はfalseを返すだけです

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

@AndroidUniversityからの回答に追加します。単一行で、次のように書くことができます。

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

イベントにバインドされたメソッド内にいる場合は、単にfalseを返します。

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

ボタンが上に座ったアコーディオンアイテムを拡張するのを防ぐために、stopPropigationpreventDefaultを使わなければなりませんでした。

そう...

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

IE(Internet Explorer)では何も機能しませんでした。私のテスターは、その後ろにあるボタンの上のポップアップウィンドウをクリックすることで私のモーダルを破ることができました。それで、私は私のモーダルスクリーンdivをクリックするのを聞き、ポップアップボタンの上に再フォーカスを強制しました。

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

JavaScriptでhrefリンクを無効にする

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

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

Angularを使ったTypeScriptでもどのように動作するか(私のバージョン:4.1.2)

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

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

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

    return false;
}

しかし、それはrouterLinkの実行を無効にしません!

1
Javan R.

これは私のために働いた:mycomponent.component.ts:

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

mycomponent.component.ts:

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

Angular 6アプリケーションをチェックインしたところ、event.stopPropagation()は$ eventを渡さなくてもイベントハンドラで機能します。

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


doSomething(){
   // write any code here

   event.stopPropagation();
}
0
Dipendu Paul

関数の後にfalseを追加するとイベントの伝達が停止します

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

このディレクティブを試してください

@Directive({
    selector: '[stopPropagation]'
})
export class StopPropagatioDirective 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);
        }
    }
}

使用法

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

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

これにより、イベントが子によって発生するという予防策から私の問題が解決しました。

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