মাউস ইভেন্টের প্রচার বন্ধ করুন


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
আমার জন্য কাজ করে না, যদি আমার কাছে অন্য ক্লিক থাকে ... <বোতাম ক্লিক-স্টপ-প্রসারণ (ক্লিক করুন) = "পরীক্ষা ($ ইভেন্ট)"> পরীক্ষা </ বাটন>
বিবি চুং

আমার জন্য কাজ করেছেন। কৌণিক 5.2.9 ব্যবহার করছি
ইয়ার্জ-টেক

1
আপনাকে কোনও ভিন্ন মাউস ইভেন্ট শোনার প্রয়োজন হতে পারে (অর্থাত্ মোডাউনডাউন, মাউসআপ)।
yohosuff

1
@ ইয়াহোসফ একটি ভাল পয়েন্ট দেয়। নির্দেশটিতে এই পদ্ধতিটি যুক্ত করুন: @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()উপলভ্য নয়। আমাকে ঠিক এটি মার্কআপে করতে হয়েছিল: `(ক্লিক করুন) =" foo (); $ ইভেন্ট.স্টপপ্রপেশন () "
অজৈবিক

এটি কাজ করে না, নোঙ্গর উপাদানটিতে রাখার সময় অন্তত নয়। উত্তরটি ভুল।
শেডো উইজার্ড আপনার পক্ষে কান

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
তারা ডিফল্ট ক্রিয়া প্রতিরোধের বিষয়ে কথা বলছে, স্টপপ্রোপেশন কী কী তা পিতামাতার উপাদানগুলির মাধ্যমে ইভেন্টের পদক্ষেপ নয়।
রিম

ওহ, এটা আমার খারাপ। দুঃখিত।
গন্টার জ্যাচবাউয়ার

2
ফিরে false
আসুন

আশ্চর্যজনক কীভাবে ভুল উত্তরগুলি অটো আপোস্ট হয় কোডটি কেবল কাজ করে না।
শেডো উইজার্ড আপনার পক্ষে কান

35

@ অ্যান্ড্রয়েড ইউনিভার্সিটি থেকে উত্তর যুক্ত করা হচ্ছে। একটি এক লাইনে আপনি এটি লিখতে পারেন:

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

সংস্করণ থেকে সংস্করণে এতটা পরিবর্তন করা উচিত নয় যেহেতু তারা এইচটিএমএল
টেম্প্লেটিং

পাশাপাশি কৌণিক 5 সঙ্গে পুরোপুরি কাজ করে।
imans77

10

আপনি যদি কোনও ইভেন্টে আবদ্ধ পদ্ধতিতে থাকেন তবে কেবল মিথ্যা ফিরিয়ে দিন:

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

1
এটি ক্লিক ইভেন্টগুলির জন্য কাজ করে । কমপক্ষে অ্যাঙ্গুলার 2 এর সর্বশেষতম সংস্করণে।
জন

6
রিটার্নিং falseকল preventDefaultনা stopPropagation
গন্টার জ্যাচবাউয়ার

রিটার্নকে মিথ্যা বলা ডিওমে প্রচার বন্ধ করে দেয়। আপনার সত্যতা পরীক্ষা করুন @ গন্তেরজ্যাচবাউয়ার এটি এনজি-বইয়ে উল্লেখ করা হয়েছে।
মোয়েবডল

3
@ মোয়াবডল একটি লিঙ্ক অন্তত আপনি যা দাবি করেছেন তা প্রদর্শন করতে পারে, তবে আসলে preventDefaultতাকে বলা হয়। github.com/angular/angular/blob/… , github.com/angular/angular/blob/…
Günter Zöchbauer

1
সঠিক! @ গন্তেরজ্যাচবাউয়ার এটি পরিষ্কার করার জন্য আপনাকে ধন্যবাদ। আমি আশা করি আমি একটি লিঙ্ক ভাগ করতে পারেন। মিথ্যা প্রত্যাবর্তনের বিষয়ে তার "এনজি-বই দি কমপ্লিট বুক অন অ্যাঙ্গুলার 4" বইয়ে আমি ন্যাটে মুরের পরামর্শ অনুসরণ করেছি; ডিওমে ইভেন্টের প্রচার বন্ধ করতে একটি ফাংশন শেষে। আপনি যা উল্লেখ করেছেন ঠিক সেভাবেই সে বর্ণনা করে। ভুল জন্য দুঃখিত.
মোয়াবডল

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

আইই (ইন্টারনেট এক্সপ্লোরার) এর জন্য কিছুই কাজ করেনি। আমার পরীক্ষকগণ এর পিছনে বোতামগুলিতে পপআপ উইন্ডোটি ক্লিক করে আমার মডেলটি ভেঙে ফেলতে সক্ষম হন। সুতরাং, আমি আমার মডেল স্ক্রিন ডিভিতে ক্লিক করার জন্য শুনলাম এবং পপআপ বোতামে জোর করে রিফোকস করলাম।

<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();" ...>...

সংক্ষেপে কেবল 'অন্যান্য' জিনিসগুলি / ফাংশন কলগুলি পৃথক করুন; এবং যোগ করুন $ ইভেন্ট.স্টপপ্রসারণ ()


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

এটি কীভাবে কৌনিক সহ টাইপস্ক্রিপ্টেও কাজ করা উচিত (আমার সংস্করণ: ৪.১.২)

টেমপ্লেট
<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']" />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.