<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
        問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
        當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

        Angular4.x Event (DOM事件和自定義事件詳解)

        來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:06:26
        文檔

        Angular4.x Event (DOM事件和自定義事件詳解)

        Angular4.x Event (DOM事件和自定義事件詳解):Angular組件和DOM元素通過(guò)事件與外部進(jìn)行通信,兩者中的事件綁定語(yǔ)法是相同的-(eventName)=expression: <button (click)=onClick()>Click</button> DOM元素 DOM 元素觸發(fā)的一些事件通過(guò) DOM 層級(jí)結(jié)構(gòu)傳播,事件首先由最內(nèi)
        推薦度:
        導(dǎo)讀Angular4.x Event (DOM事件和自定義事件詳解):Angular組件和DOM元素通過(guò)事件與外部進(jìn)行通信,兩者中的事件綁定語(yǔ)法是相同的-(eventName)=expression: <button (click)=onClick()>Click</button> DOM元素 DOM 元素觸發(fā)的一些事件通過(guò) DOM 層級(jí)結(jié)構(gòu)傳播,事件首先由最內(nèi)

        Angular組件和DOM元素通過(guò)事件與外部進(jìn)行通信,兩者中的事件綁定語(yǔ)法是相同的-(eventName)="expression":

        <button (click)="onClick()">Click</button>

        DOM元素

        DOM 元素觸發(fā)的一些事件通過(guò) DOM 層級(jí)結(jié)構(gòu)傳播,事件首先由最內(nèi)層的元素開(kāi)始,然后傳播到外部元素,直到它們到根元素,這種傳播過(guò)程稱(chēng)為事件冒泡。

        DOM事件冒泡與Angular可以無(wú)縫工作,具體示例如下:

        import { Component } from '@angular/core';
        
        @Component({
         selector: 'exe-app',
         template: `
         <div (click)="onClick()">
         <button>Click</button>
         </div>
         `
        })
        export class AppComponent {
         onClick() {
         console.log('Click');
         }
        }

        以上代碼成功運(yùn)行后,當(dāng)用戶點(diǎn)擊 Click 按鈕,瀏覽器控制臺(tái)將會(huì)輸出:

        Click

        即表示 <div> 元素上設(shè)置的監(jiān)聽(tīng)函數(shù)被執(zhí)行,也間接證明了事件冒泡能正常工作。

        Angular Component

        Angular 允許開(kāi)發(fā)者通過(guò) @Output() 裝飾器和 EventEmitter 自定義事件。它不同于 DOM 事件,因?yàn)樗恢С质录芭荨?/p>

        首先來(lái)看一下自定義組件如何監(jiān)聽(tīng)DOM事件:

        event-bubbling.component.ts

        import { Component } from '@angular/core';
        
        @Component({
         selector: 'event-bubbling',
         template: `
         <div>
         <button>Click</button>
         </div>
         `
        })
        export class EventBubblingComponent { }

        app.component.ts

        import { Component } from '@angular/core';
        
        @Component({
         selector: 'exe-app',
         template: `
         <div>
         <event-bubbling (click)="onClick()"></event-bubbling>
         </div>
         `
        })
        export class AppComponent {
         onClick() {
         console.log('Click');
         }
        }

        以上代碼成功運(yùn)行后,當(dāng)用戶點(diǎn)擊 Click 按鈕,瀏覽器控制臺(tái)也會(huì)輸出 Click。表示我們的自定義組件,也是可以正常處理組件內(nèi)元素觸發(fā)的 click 事件。但當(dāng)我們?cè)谧远x組件中創(chuàng)建自定義事件時(shí),事件名稱(chēng)也是使用 click ,那么會(huì)不會(huì)有問(wèn)題呢?我們馬上來(lái)實(shí)踐一下。

        Custom Events

        event-bubbling.component

        import { Component, Output, EventEmitter } from '@angular/core';
        
        @Component({
         selector: 'event-bubbling',
         template: `
         <div>
         <button (click)="onClick('Button 1')">Button 1</button>
         <button (click)="onClick('Button 2')">Button 2</button>
         </div>
         `
        })
        export class EventBubblingComponent {
         @Output() click = new EventEmitter();
        
         onClick(button: string) {
         this.click.next(button);
         }
        }

        app.component.ts

        import { Component } from '@angular/core';
        
        @Component({
         selector: 'exe-app',
         template: `
         <div>
         <event-bubbling (click)="onClick($event)"></event-bubbling>
         </div>
         `
        })
        export class AppComponent {
         onClick(event: any) {
         console.log(event);
         }
        }

        以上代碼成功運(yùn)行后,當(dāng)用戶點(diǎn)擊 Button 1 按鈕時(shí),瀏覽器控制臺(tái)將會(huì)輸出:

        Button 1 
        MouseEvent {isTrusted: true, screenX: 69, screenY: 161, clientX: 43, clientY: 22…}

        我們看到控制臺(tái)輸出了兩個(gè)信息,說(shuō)明在這種情況下,Angular 可以處理自定義事件和 DOM (click) 事件。當(dāng) click 事件觸發(fā)后,onClick() 方法接收的 event 參數(shù)是 MouseEvent 對(duì)象。

        那么要如何修復(fù)這個(gè)問(wèn)題呢?我們可以利用 DOM 事件提供的防止冒泡的機(jī)制,即 stopPropagation() 方法。具體示例如下:

        event-bubbling.component.ts

        import { Component, Output, EventEmitter } from '@angular/core';
        
        @Component({
         selector: 'event-bubbling',
         template: `
         <div>
         <button (click)="onClick($event, 'Button 1')">Button 1</button>
         <button (click)="onClick($event, 'Button 2')">Button 2</button>
         </div>
         `
        })
        export class EventBubblingComponent {
         @Output() click = new EventEmitter();
        
         onClick(event: Event, button: string) {
         event.stopPropagation();
         this.click.next(button);
         }
        }

        以上代碼成功運(yùn)行后,當(dāng)用戶點(diǎn)擊 Button 1 按鈕時(shí),只會(huì)輸出 Button 1 ,即問(wèn)題我們已經(jīng)修復(fù)了。

        現(xiàn)在我們來(lái)總結(jié)一下:

        DOM 事件冒泡機(jī)制,允許在父元素監(jiān)聽(tīng)由子元素觸發(fā)的 DOM 事件

        Angular 支持 DOM 事件冒泡機(jī)制,但不支持自定義事件的冒泡。

        自定義事件名稱(chēng)與 DOM 事件的名稱(chēng)如 (click,change,select,submit) 同名,可能會(huì)導(dǎo)致問(wèn)題。雖然可以使用 stopPropagation() 方法解決問(wèn)題,但實(shí)際工作中,不建議這樣使用。

        Event Modifiers

        在實(shí)際項(xiàng)目中,我們經(jīng)常需要在事件處理器中調(diào)用 preventDefault() 或 stopPropagation() 方法:

        preventDefault() - 如果事件可取消,則取消該事件,意味著該事件的所有默認(rèn)動(dòng)作都不會(huì)發(fā)生。需要注意的是該方法不會(huì)阻止該事件的冒泡

        stopPropagation() - 阻止當(dāng)前事件在 DOM 樹(shù)上冒泡

        對(duì)于 preventDefault() 方法,有一個(gè)經(jīng)典的應(yīng)用場(chǎng)景。即當(dāng)我們希望點(diǎn)擊鏈接在新窗口打開(kāi)頁(yè)面,但不希望當(dāng)前頁(yè)面跳轉(zhuǎn)。這個(gè)時(shí)候可以使用 preventDefault() 阻止后面將要執(zhí)行的瀏覽器默認(rèn)動(dòng)作。

        <a id="link"  rel="external nofollow" >Angular 4.x 事件冒泡</a>
        <script>
         document.getElementById('link').onclick = function(ev) {
         ev.preventDefault(); // 阻止瀏覽器默認(rèn)動(dòng)作 (頁(yè)面跳轉(zhuǎn))
         window.open(this.href); // 在新窗口打開(kāi)頁(yè)面
         };
        </script>

        在 Angular 中阻止 DOM 事件冒泡,我們可以使用以下兩種方式:

        方式一:

        <div>
         <button (click)="$event.stopPropagation(); doSomething()">Click me</button>
        </div>

        方式二:

        @Component({
         selector: 'exe-app',
         template: `
         <div>
         <button (click)="doSomething($event)">Click me</button>
         </div>`
        })
        export class AboutComponent {
         doSomething($event: Event) {
         $event.stopPropagation();
         // your logic
         }
        }

        是不是感覺(jué)很麻煩,每次都得顯式地調(diào)用 $event.stopPropagation() 方法。有沒(méi)有更簡(jiǎn)便的方法呢?能不能使用聲明式的語(yǔ)法?在 Vue 中可以通過(guò)聲明式的方式,解決我們上面的問(wèn)題。具體如下:

        <!-- the click event's propagation will be stopped -->
        <a v-on:click.stop="doThis"></a>
        
        <!-- the submit event will no longer reload the page -->
        <form v-on:submit.prevent="onSubmit"></form>
        
        <!-- the click event will be triggered at most once -->
        <a v-on:click.once="doThis"></a>
        

        接下來(lái)我們也來(lái)基于 Angular 的指令系統(tǒng),實(shí)現(xiàn)上述的功能。最終的使用示例如下:

        <div class="parent" (click)="fromParent()">
         <button class="child" (click.stop)="fromChild()">Click me</button>
        </div>

        自定義 [click.stop] 指令

        @Directive({
         selector: '[click.stop]'
        })
        export class StopPropagationDirective {
         @Output("click.stop") stopPropEvent = new EventEmitter();
         unsubscribe: () => void;
        
         constructor(
         private renderer: Renderer2, // Angular 2.x導(dǎo)入Renderer
         private element: ElementRef) {
         }
        
         ngOnInit() {
         this.unsubscribe = this.renderer.listen(
         this.element.nativeElement, 'click', event => {
         event.stopPropagation();
         this.stopPropEvent.emit(event);
         });
         }
        
         ngOnDestroy() {
         this.unsubscribe();
         }
        }

        [click.stop] 指令應(yīng)用

        import { Component } from '@angular/core';
        
        @Component({
         selector: 'exe-app',
         template: `
         <div class="parent" (click)="fromParent()">
         <button class="child" (click.stop)="fromChild()">Click me</button>
         </div>
         `
        })
        export class AppComponent {
         fromChild() {
         console.log('I am Child');
         }
        
         fromParent() {
         console.log('I am Parent');
         }
        }

        以上代碼成功運(yùn)行后,當(dāng)用戶點(diǎn)擊 Click me 按鈕時(shí),瀏覽器控制臺(tái)只會(huì)輸出 I am Child。若把 (click.stop) 改為 (click) ,當(dāng)用戶再次點(diǎn)擊 Click me 按鈕時(shí),控制臺(tái)就會(huì)輸出兩條信息。有興趣的讀者,可以親自驗(yàn)證一下哈。

        這篇Angular4.x Event (DOM事件和自定義事件詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

        聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Angular4.x Event (DOM事件和自定義事件詳解)

        Angular4.x Event (DOM事件和自定義事件詳解):Angular組件和DOM元素通過(guò)事件與外部進(jìn)行通信,兩者中的事件綁定語(yǔ)法是相同的-(eventName)=expression: <button (click)=onClick()>Click</button> DOM元素 DOM 元素觸發(fā)的一些事件通過(guò) DOM 層級(jí)結(jié)構(gòu)傳播,事件首先由最內(nèi)
        推薦度:
        標(biāo)簽: 自定義 event angular
        • 熱門(mén)焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門(mén)推薦

        專(zhuān)題
        Top
        主站蜘蛛池模板: 大地资源中文在线观看免费版 | 国产亚洲精品a在线无码| 亚洲av成人一区二区三区观看在线 | 亚洲视频在线观看地址| a毛片在线免费观看| 亚洲中文久久精品无码| 中文字幕免费在线看| 亚洲线精品一区二区三区影音先锋| 一级一级一级毛片免费毛片| 亚洲国产成人久久精品99| 亚洲免费一区二区| 自拍偷自拍亚洲精品情侣| 在线观看黄片免费入口不卡| 亚洲男同帅GAY片在线观看| 久热免费在线视频| 亚洲春色另类小说| 性色av免费观看| 一级毛片a免费播放王色电影| 中文字幕不卡亚洲| 色欲国产麻豆一精品一AV一免费| 久久精品国产亚洲精品2020| 免费大片黄在线观看yw| 久久亚洲精品无码av| 亚洲一区无码中文字幕| 91久久青青草原线免费| 亚洲色大18成人网站WWW在线播放| 国产成人免费手机在线观看视频 | 亚洲乱码一区二区三区在线观看| 免费无码av片在线观看| 亚洲欧洲国产精品久久| 国产男女猛烈无遮挡免费视频网站| 亚州**色毛片免费观看| 亚洲男人电影天堂| 国产成人精品高清免费| 精品免费视在线观看| 亚洲综合色区中文字幕| 亚洲第一成人影院| 中文字幕免费观看| 国产精品无码亚洲精品2021| 亚洲AV无码国产丝袜在线观看| 大地资源免费更新在线播放|