माउस घटना प्रचार बंद करो


238

कोणीय 2 में माउस घटनाओं के प्रसार को रोकने का सबसे आसान तरीका क्या है? क्या मुझे विशेष $eventऑब्जेक्ट पास करना चाहिए और stopPropagation()खुद को कॉल करना चाहिए या कोई अन्य तरीका है। उल्का में उदाहरण के लिए मैं बस 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
यह मेरे लिए काम नहीं करता है। क्लिक करने की घटना को रोका नहीं गया है :(
डायलो

9
मेरे लिए काम नहीं करता है, अगर मेरे पास अन्य क्लिक है ... <बटन क्लिक-स्टॉप-प्रचार (क्लिक करें) = "परीक्षण ($ घटना)"> परीक्षण </ बटन>
Bibby चुंग

मेरे लिए काम किया। कोणीय 5.2.9 का प्रयोग
yarz-tech

1
आपको एक अलग माउस ईवेंट (यानी मूसडाउन, माउसअप) सुनने की आवश्यकता हो सकती है।
yohosuff

1
@yohosuff एक अच्छा बिंदु बनाता है। इस विधि को निर्देश में जोड़ें: @HostListener("mousedown", ["$event"]) public onMousedown(event: any): void { event.stopPropagation(); }
andreisrob

252

सबसे आसान है कि किसी इवेंट हैंडलर पर स्टॉप प्रोपोगेशन को बुलावा दिया जाए। $eventकोणीय 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
साथ ही असत्य लौटने की कोशिश करें
जोशुआ माइकल वैगनर

ऐसा लगता है कि जब तक आप eventहैंडलर फ़ंक्शन stopPropogation()को संभालते हैं , तब तक उपलब्ध नहीं होता है। मुझे इसे मार्कअप में सही करना था: `(क्लिक करें) =" फू (), $ घटना। स्टॉपप्रोपोगेशन () "
अकार्बनिक

यह काम नहीं करता है, कम से कम नहीं जब लंगर तत्व में रखा जाता है। उत्तर गलत है।
शैडो विजार्ड इयर फॉर यू

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 से संकेत मिलता है कि इसे काम करना चाहिए। हालांकि उनके पास ;अंत नहीं है। मैं उसे बदल दूंगा।
गुंटर Zöchbauer

1
वे डिफ़ॉल्ट कार्रवाई को रोकने के बारे में बात कर रहे हैं, माता-पिता के तत्वों के माध्यम से घटना को रोकना नहीं है जो कि रोक है।
रेम

ओह, यह मेरा बुरा है। माफ़ करना।
गुंटर Zöchbauer


कमाल है कि कैसे गलत उत्तर ऑटो अपवोट प्राप्त करते हैं। कोड बस काम नहीं करता है।
शैडो विजार्ड इयर फॉर यू

35

@AndroidUniversity से उत्तर को जोड़ना। एक पंक्ति में आप इसे इस तरह लिख सकते हैं:

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

यह संस्करण से संस्करण में इतना परिवर्तन नहीं करना चाहिए क्योंकि वे html
गति

पूरी तरह से कोणीय 5 के साथ ही काम करता है।
imans77

10

यदि आप किसी ईवेंट के लिए बाध्य हैं, तो केवल गलत तरीके से लौटें:

@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
गुंटर ज़ोचबॉएर

झूठे को कॉल करने से DOM में प्रचार बंद हो जाता है। अपने तथ्यों की जाँच करें @ GünterZöchbauer यह एनजी बुक में उल्लिखित है।
मुहबेदोल

3
@moeabdol एक लिंक कम से कम आप जो दावा करते हैं उसे प्रदर्शित कर सकता है, लेकिन वास्तव preventDefaultमें कहा जाता है। github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
Günter Zöchbauer

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 में काम किया .. धन्यवाद।
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 (इंटरनेट एक्सप्लोरर) के लिए कुछ भी काम नहीं किया। मेरे परीक्षक इसके पीछे के बटन पर पॉपअप विंडो को क्लिक करके मेरे मोडल को तोड़ने में सक्षम थे। इसलिए, मैंने अपने मोडल स्क्रीन डिव पर एक क्लिक के बारे में सुना और पॉपअप बटन पर रीफोकस करने के लिए मजबूर किया।

<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

मैंने सिर्फ एक एंगुलर 6 एप्लिकेशन में चेक किया, ईवेंट.स्टॉपप्रॉपैजेशन () एक इवेंट हैंडलर पर काम करता है, यहां तक ​​कि किसी भी एप को पास किए बिना

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


doSomething(){
   // write any code here

   event.stopPropagation();
}

1

जावास्क्रिप्ट के साथ href लिंक को अक्षम करें

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

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

यह कोणीय के साथ टाइपस्क्रिप्ट में भी कैसे काम करना चाहिए (मेरा संस्करण: 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;
}

लेकिन यह रूटरलिंक के निष्पादन को अक्षम नहीं करता है!



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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.