หยุดการแพร่กระจายเหตุการณ์ของเมาส์


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-propagation (คลิก) = "ทดสอบ ($ event)"> ทดสอบ </button>
Bibby Chung

ทำงานให้ฉัน ใช้ Angular 5.2.9
yarz-tech

1
คุณอาจต้องฟังเหตุการณ์เมาส์อื่น (เช่น. mousedown, mouseup)
yohosuff

1
@yohosuff ทำให้เป็นจุดที่ดี เพิ่มวิธีนี้ในคำสั่ง: @HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
andreisrob

253

ที่ง่ายที่สุดคือการโทรหยุดการแพร่กระจายบนตัวจัดการเหตุการณ์ $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(); };
Saeed Neamati

4
ลองส่งคืนเท็จเช่นกัน
Joshua Michael Wagoner

ดูเหมือนว่าตามเวลาที่คุณจัดการeventในฟังก์ชั่นการจัดการstopPropogation()ไม่สามารถใช้ได้ ฉันต้องทำอย่างถูกต้องในมาร์กอัป: `(คลิก) =" 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/4782และgithub.com/angular/angular/pull/5892/filesระบุว่าควรใช้งานได้ พวกเขาไม่มี;ที่สิ้นสุดแม้ว่า ฉันจะเปลี่ยนสิ่งนั้น
GünterZöchbauer

1
พวกเขากำลังพูดถึงเกี่ยวกับการป้องกันการกระทำเริ่มต้นไม่ได้เหยียบเหตุการณ์ผ่านองค์ประกอบผู้ปกครองสิ่งที่หยุดการแพร่กระจายเป็นเรื่องเกี่ยวกับ
Rem

โอ้นั่นคือสิ่งที่ไม่ดีของฉัน ขอโทษ
GünterZöchbauer

2
ย้อนกลับfalse<3
Pawel Gorczynski

น่าประหลาดใจที่คำตอบที่ผิดได้รับการโหวตอัตโนมัติ รหัสไม่ทำงาน
Shadow Wizard คือ Ear For You

35

การเพิ่มคำตอบจาก @AndroidUniversity ในบรรทัดเดียวคุณสามารถเขียนได้เช่น:

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

ไม่ควรเปลี่ยนจากเวอร์ชันเป็นเวอร์ชันมากนักเนื่องจากพวกเขาพยายามรักษามาตรฐานการสร้างเทมเพลต HTML ไว้อย่างดี :)
27417

ทำงานได้อย่างสมบูรณ์แบบด้วย angular 5 เช่นกัน
imans77

10

หากคุณอยู่ในเมธอดที่ผูกกับเหตุการณ์

@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ünterZöchbauer

การเรียกคืนเท็จจะหยุดการแพร่กระจายใน DOM ตรวจสอบข้อเท็จจริงของคุณ @ GünterZöchbauerมันถูกกล่าวถึงในหนังสือ
moeabdol

3
@moeabdol ลิงก์อย่างน้อยสามารถแสดงให้เห็นถึงสิ่งที่คุณเรียกร้อง แต่จริงๆแล้วpreventDefaultเรียกว่า github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
GünterZöchbauer

1
แก้ไข! @ GünterZöchbauerขอขอบคุณที่ชี้แจงเรื่องนี้ ฉันหวังว่าฉันจะแบ่งปันลิงก์ ฉันทำตามคำแนะนำของเนทเมอเรย์ในหนังสือของเขา "ng-book หนังสือที่สมบูรณ์เกี่ยวกับ Angular 4" ของการส่งคืนเท็จ ที่ส่วนท้ายของฟังก์ชันเพื่อหยุดการเผยแพร่เหตุการณ์ใน 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

ฉันต้อง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) ผู้ทดสอบของฉันสามารถทำลายคำกริยาของฉันได้โดยคลิกที่หน้าต่างป๊อปอัปที่ปุ่มด้านหลัง ดังนั้นฉันจึงฟังการคลิกบนหน้าจอ mod ของฉันและบังคับให้ทำการรีโฟกัสบนปุ่มป๊อปอัพ

<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

วิธีนี้แก้ไขปัญหาของฉันจากการป้องกันไม่ให้เหตุการณ์ถูกไล่ออกโดยเด็ก:

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.