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


238

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

回答:


234

同じコードを何度もコピー/貼り付けすることなく、これを要素に追加できるようにしたい場合は、これを行うためのディレクティブを作成できます。以下のように簡単です:

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>

5
私にはうまくいきません。クリックイベントは停止されません:(
Diallo

9
他のクリックがある場合は機能しません... <button click-stop-propagation(click)= "test($ event)"> test </ button>
Bibby Chung

私のために働いた。Angular 5.2.9の使用
yarz-tech

1
別のマウスイベント(つまり、mousedown、mouseup)をリッスンする必要がある場合があります。
ヨホサフ

1
@yohosuffは良い点になります。:ディレクティブにこのメソッドを追加 @HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
andreisrob

252

最も簡単なのは、イベントハンドラーで伝播の停止を呼び出すことです。$eventAngular 2でも同じように動作し、進行中のイベントが含まれます(マウスクリック、マウスイベントなど)。

(click)="onEvent($event)"

イベントハンドラーで、伝播を停止できます。

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

2
私のカスタムディレクティブでは機能しません。<button confirmMessage="are you sure?" (click)="delete()">Delete</button>、そして私のディレクティブでは:(click)="confirmAction($event)、そしてconfirmAction(event) { event.stopPropagation(); };
Saeed Neamati 2017

4
同様にfalseを返してみてください
ジョシュアマイケルワゴナー2017

あなたeventがハンドラー関数stopPropogation()で処理するまでには利用できないようです。私はマークアップでそれを正しくしなければなりませんでした: `(click)=" foo(); $ event.stopPropogation() "
inorganik

これは、少なくともアンカー要素に配置された場合は機能しません。答えは間違っています。
Shadow WizardはEar For Youです

143

stopPropagationイベントを呼び出すと、伝播が妨げられます。 

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

以下のためpreventDefaultだけのリターンfalse

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

私自身は試していませんが、github.com / angular / angular / issues / 4782github.com/angular/angular/pull/5892/filesで動作するはずです。;ただし、最後にはありません。変更します。
ギュンターZöchbauer

1
彼らは、stopPropagationについての親要素を介してイベントをステップ実行するのではなく、デフォルトのアクションを防止することについて話している。
2016

ああ、それは私の悪いことです。ごめんなさい。
ギュンターZöchbauer

2
return false<3
Pawel Gorczynski 18/07/23

間違った答えが自動賛成票を獲得する驚くべき方法。コードは単に機能しません。
Shadow WizardはEar For Youです

35

@AndroidUniversityからの回答に追加します。1行で次のように記述できます。

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

彼らはhtmlテンプレート標準を維持しようとするので、バージョン
ごとに

角度5でも完全に動作します。
imans77

10

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

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

1
それはありませんクリックイベントのために仕事を。少なくともAngular2の最新バージョンでは。
2016年

6
ないfalse呼び出しを返します。preventDefaultstopPropagation
ギュンターZöchbauer

return falseを呼び出すと、DOMでの伝播が停止します。事実を確認してください@GünterZöchbauerng-bookに記載されています。
moeabdol

3
@moeabdolリンクは、あなたが主張することを少なくとも示すことができますが、実際にpreventDefaultは呼び出されます。github.com/angular/angular/blob/...github.com/angular/angular/blob/...
ギュンターZöchbauer

1
正しい!@GünterZöchbauerこれを明確にしていただきありがとうございます。リンクを共有したいです。私は彼の著書「ng-book The Complete Book on Angular 4」でfalseを返すというネイトマレーのアドバイスに従いました。DOMでのイベントの伝播を停止する関数の最後。彼はあなたが言ったとおりにそれを説明します。誤解してすみません。
moeabdol

8

これは私のために働きました:

mycomponent.component.ts:

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

mycomponent.component.html:

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

このソリューションは、角度5.で私に役立ちました。ありがとうございます。
インバ

5

私が持っていたstopPropigationし、preventDefaultボタンが上にあるアコーディオンアイテムを拡大するのを防ぐために、。

そう...

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

3

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

使った

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

つまり、他のもの/関数呼び出しを「;」で区切るだけです。$ event.stopPropagation()を追加します


2

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

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


doSomething(){
   // write any code here

   event.stopPropagation();
}

1

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

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

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

Angularを使用したTypeScriptでも機能する方法(My Version:4.1.2)

テンプレート
<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;
}

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


0

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

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

0

これにより、イベントが子供によって発生するのを防ぐことから、私の問題を解決しました:

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


0

このディレクティブを試す

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

使用法

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

<input 
    type="text" 
    [stopPropagation]="['input', 'click']" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.