마우스 이벤트 전파 중지


239

Angular 2에서 마우스 이벤트 전파를 중지하는 가장 쉬운 방법은 무엇입니까? 특별한 $event물건을 전달 하고 stopPropagation()직접 전화 해야하거나 다른 방법이 있어야합니다. 예를 들어 Meteor false에서는 이벤트 핸들러에서 간단히 반환 할 수 있습니다 .

답변:


235

동일한 코드를 반복해서 복사 / 붙여 넣지 않고도 요소에 이것을 추가하고 싶을 경우, 지시를 내릴 수 있습니다. 다음과 같이 간단합니다.

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
<click click-stop-propagation (click) = "test ($ event)"> test </ button>
Bibby Chung

나를 위해 일했다. Angular 5.2.9 사용
yarz-tech

1
다른 마우스 이벤트 (예 : mousedown, mouseup)를 수신해야 할 수도 있습니다.
yohosuff 2012

1
@yohosuff가 좋은 지적입니다. 지시문에 다음 방법을 추가하십시오. @HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
andreisrob

253

가장 간단한 방법은 이벤트 핸들러에서 전파 중지를 호출하는 것입니다. $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

4
거짓을 다시 시도하십시오
Joshua Michael Wagoner

event핸들러 함수에서 처리 할 때까지는 stopPropogation()사용할 수없는 것 같습니다 . 마크 업에서 바로해야했습니다 :`(click) = "foo (); $ event.stopPropogation ()"
inorganik

앵커 요소에 배치 된 경우에는 작동하지 않습니다. 대답이 잘못되었습니다.
Shadow Wizard는 당신을위한 귀입니다.

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 는 그것이 작동해야 함을 나타냅니다. 그들은이없는 ;것처럼 말. 변경하겠습니다.
Günter Zöchbauer

1
그들은 stopPropagation에 관한 부모 요소를 통한 이벤트 스테핑이 아니라 기본 조치 방지에 대해 이야기하고 있습니다.
Rem

아, 그건 내 잘못이야 죄송합니다.
Günter Zöchbauer

2
return false<3
Pawel Gorczynski

잘못된 답변이 자동 투표를받는 방법이 놀랍습니다. 코드가 작동하지 않습니다.
Shadow Wizard는 당신을위한 귀입니다.

35

@AndroidUniversity의 답변에 추가하십시오. 한 줄에 다음과 같이 작성할 수 있습니다.

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

그들은 HTML 템플릿 표준을 유지하려고 노력하기 때문에 버전마다 크게 바뀌지 않아야합니다 :)
dinigo

각도 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 이상.
Jon

6
반환 false전화를 preventDefault하지 stopPropagation.
Günter Zöchbauer 2016 년

return false를 호출하면 DOM에서 전파가 중지됩니다. 사실 확인하기 @ GünterZöchbauer ng-book에 언급되어 있습니다.
moeabdol

3
@moeabdol 링크는 적어도 당신이 주장하는 것을 보여줄 수 있지만 실제로 preventDefault는 호출됩니다. github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
Günter Zöchbauer

1
옳은! @ GünterZöchbauer 이것을 명확히 해 주셔서 감사합니다. 링크를 공유 할 수 있으면 좋겠습니다. 나는 그의 책 "ng-book The Angular 4에 관한 완전한 책"에서 Nate Murray의 조언을 따랐다. 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에서 저에게 효과적이었습니다. 감사합니다.
inbha

5

나는에 가지고 stopPropigationpreventDefault그 위에 앉으 아코디언 항목을 확대 버튼을 방지하기 위해.

그래서...

@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에서도 작동하는 방법 (내 버전 : 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.