Остановить распространение событий мыши


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
не работает для меня, если у меня есть другой щелчок ... <button click-stop-распространение (click) = "test ($ event)"> test </ button>
Бибби Чанг,

Работал на меня. Использование Angular 5.2.9
yarz-tech

1
Вам может потребоваться прослушать другое событие мыши (например, mousedown, mouseup).
yohosuff

1
@yohosuff делает хорошую мысль. Добавьте этот метод к директиве: @HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
andreisrob

254

Самое простое - вызвать остановку распространения в обработчике событий. $eventработает аналогично в Angular 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(); };
Саид Нимати

4
Попробуйте также вернуть false
Джошуа Майкл Вагонер

Кажется, что к тому времени, когда вы обрабатываете 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/4782 и github.com/angular/angular/pull/5892/files указывают, что это должно работать. Они не имеют ;в конце, хотя. Я изменю это.
Гюнтер Цохбауэр

1
Они говорят о предотвращении действия по умолчанию, не пропуская событие через родительские элементы, что такое stopPropagation.
Рем

О, это плохо. Сожалею.
Гюнтер Цохбауэр

2
возвращение false<3
Павел Горчинский

Удивительно, как неправильные ответы получают авто-голосов. Код просто не работает.
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.
Джон

6
Обратных falseзвонков preventDefaultнет stopPropagation.
Гюнтер Цохбауэр

Вызов return false останавливает распространение в DOM. Проверьте свои факты @ GünterZöchbauer Это упомянуто в нг-книге.
моэбдол

3
@moeabdol ссылка может хотя бы продемонстрировать то, что вы утверждаете, но на самом деле preventDefaultназывается. github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
Гюнтер Цохбауэр

1
Верный! @ GünterZöchbauer Спасибо за разъяснение этого. Я хотел бы поделиться ссылкой. Я последовал совету Нейта Мюррея в его книге «Полная книга о угловом 4» о возвращении ложного; в конце функции, чтобы остановить распространение события в DOM. Он описывает это именно так, как вы упомянули. Извините за недопонимание.
моэбдол

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

Отключить ссылку href с помощью JavaScript

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

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

Как это должно также работать в TypeScript с Angular (Моя версия: 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!


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']" />
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.