vue阻止事件冒泡和捕獲方式
@click.stop: 阻止事件冒泡@click.prevent: 阻止事件默認(rèn)行為@click.self: 事件只作用在元素本身,而不是其子元素
要想了解 VUE 阻止事件冒泡和捕獲方法,首先要了解一下 JS 事件和 JS 阻止事件冒泡,捕獲方法
1、js 事件的三階段

捕獲階段
目標(biāo)階段:執(zhí)行當(dāng)前對(duì)象的事件處理程序
冒泡階段
2、js 阻止事件冒泡,捕獲
@click.stop: 阻止事件冒泡@click.prevent: 阻止事件默認(rèn)行為@click.self: 事件只作用在元素本身,而不是其子元素
<a @click.stop="doThis">阻止單擊事件繼續(xù)傳播</a> <form @submit.prevent="onSubmit">提交事件不再重載頁(yè)面</form> <a @click.stop.prevent="doThat">修飾符可以串聯(lián)</a> <div @click.self="doThat">只當(dāng)在 event.target 是當(dāng)前元素自身時(shí)觸發(fā)處理函數(shù).即事件不是從內(nèi)部元素觸發(fā)的</div>
補(bǔ)充其他修飾符
@click.capture: 使用事件捕獲模式@click.once: 事件只觸發(fā)一次 2.1.4新增@scroll.passive: 告訴瀏覽器這個(gè)事件的默認(rèn)行為不會(huì)被取消 2.3.0新增@keyup.enter: 按鍵修飾符,enter被按下的時(shí)候觸發(fā)@click.ctrl: 系統(tǒng)修飾符,Ctrl 被按下的時(shí)候觸發(fā) 2.1.0新增@click.ctrl.exact: 有且只有 Ctrl 被按下的時(shí)候才觸發(fā) 2.5.0新增
<div @click.capture="doThis">添加事件監(jiān)聽器時(shí)使用事件捕獲模式,即元素自身觸發(fā)的事件先在此處處理,然后才交由內(nèi)部元素進(jìn)行處理</div> <a @click.once="doThis">點(diǎn)擊事件將只會(huì)觸發(fā)一次</a> <div @scroll.passive="onScroll">scroll事件不會(huì)取消默認(rèn)的滾動(dòng)行為</div> <input @keyup.13="submit" placeholder="只有在 keyCode 是 13 時(shí)調(diào)用 vm.submit()"> <button @click.ctrl="onClick">即使 Alt 或 Shift 被一同按下時(shí)也會(huì)觸發(fā)</button> <button @click.ctrl.exact="onCtrlClick">有且只有 Ctrl 被按下的時(shí)候才觸發(fā)</button> <button @click.exact="onClick">沒(méi)有任何系統(tǒng)修飾符被按下的時(shí)候才觸發(fā)</button>
使用修飾符時(shí),順序很重要,相應(yīng)的代碼會(huì)以同樣的順序產(chǎn)生。
例如:用 @click.prevent.self 會(huì)阻止所有的點(diǎn)擊,而@click.self.prevent 只會(huì)阻止元素上的點(diǎn)擊。
3、JavaScript基礎(chǔ)知識(shí):preventDefault和stopPropagation
preventDefault()事件方法
【定義】:如果事件是可取消的,則 preventDefault() 方法會(huì)取消該事件,這意味著屬于該事件的默認(rèn)操作將不會(huì)發(fā)生。
單擊“提交”按鈕,阻止其提交表
<form action="https://www.baidu.com/" method="post">
<input type="submit" value="登錄">
</form>
<script>
console.log(document.forms[0]);
document.forms[0].onsubmit = function(){
console.log(event);
console.log(event.cancelable);//檢測(cè)事件是否可以取消--> Boolean
event.preventDefault();//阻止默認(rèn)事件 單
//return false; // 也可以阻止默認(rèn)事件
}
</script>單擊鏈接,防止鏈接跟隨 URL
<a rel="external nofollow" id="a">點(diǎn)我跳轉(zhuǎn)</a>
<script>
let a = document.getElementById('a');
a.onclick = function(){
console.log(event);
console.log(event.cancelable);//檢測(cè)事件是否可以取消 -->Boolean
event.preventDefault();//阻止默認(rèn)事件
//return false; // 也可以阻止默認(rèn)事件
}
</script>非所有活動(dòng)都可以取消。請(qǐng)使用 cancelable 屬性 來(lái)確定事件是否可取消。
如上面兩個(gè)示例中,其返回值為Boolean,可以取消–>true,否則為–>false
【注】preventDefault() 方法不會(huì)阻止事件通過(guò) DOM 進(jìn)一步傳播。請(qǐng)使用 stopPropagation() 方法來(lái)解決
stopPropagation()事件方法
stopPropagation() 方法防止調(diào)用相同事件的傳播
【傳播階段】傳播意味著向上冒泡到父元素或向下捕獲到子元素或元素目標(biāo)本體 三個(gè)3?? 階段
【注】添加事件(HTML屬性事件,JavaScript元素事件,addEventLisenter,attachEvent(IE))默認(rèn)都是冒泡,捕獲需要**addEventLisenter()**顯式的指定第三個(gè)參數(shù)為true(事件捕獲)
//樣式
<style>
div {
padding: 50px;
background-color: rgba(255, 0, 0, 0.2);
text-align: center;
cursor: pointer;
}
</style>
//HTML
<p>Click DIV 1:</p>
<div onclick="func2()">DIV 2
<div onclick="func1(event)">DIV 1</div>
</div>
//script
<script>
function func1(event) {
alert("DIV 1");
event.stopPropagation();//阻止事件傳播
}
function func2() {
alert("DIV 2");
}
</script>不阻止事件傳播的話,當(dāng)點(diǎn)擊DIV2時(shí),事件會(huì)繼續(xù)向上傳播,觸發(fā)父元素DIV1上的func2(),然后會(huì)繼續(xù)向上傳播,直到window對(duì)象
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決Element ui導(dǎo)航欄選中背景色刷新消失的問(wèn)題
這篇文章主要介紹了解決Element ui導(dǎo)航欄選中背景色刷新消失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
vue動(dòng)態(tài)修改頁(yè)面title的兩種方法
本文主要介紹了vue動(dòng)態(tài)修改頁(yè)面title的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
修改vue源碼實(shí)現(xiàn)動(dòng)態(tài)路由緩存的方法
這篇文章主要介紹了修改vue源碼實(shí)現(xiàn)動(dòng)態(tài)路由緩存的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Vue2利用Axios發(fā)起請(qǐng)求的詳細(xì)過(guò)程記錄
有很多時(shí)候你在構(gòu)建應(yīng)用時(shí)需要訪問(wèn)一個(gè)API并展示其數(shù)據(jù),做這件事的方法有好幾種,而使用基于promise的HTTP客戶端axios則是其中非常流行的一種,這篇文章主要給大家介紹了關(guān)于Vue2利用Axios發(fā)起請(qǐng)求的詳細(xì)過(guò)程,需要的朋友可以參考下2021-12-12
vue-router?導(dǎo)航完成后獲取數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了vue-router?導(dǎo)航完成后獲取數(shù)據(jù),通過(guò)使用生命周期的 created() 函數(shù),在組件創(chuàng)建完成后調(diào)用該方法,本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì)需要的朋友可以參考下2022-11-11
Vant?UI中van-collapse下拉折疊面板默認(rèn)展開第一項(xiàng)的方法
之前做項(xiàng)目的時(shí)候,使用了Collapse折疊面板,下面這篇文章主要給大家介紹了關(guān)于Vant?UI中van-collapse下拉折疊面板默認(rèn)展開第一項(xiàng)的相關(guān)資料,需要的朋友可以參考下2022-03-03
基于Vue+element-ui 的Table二次封裝的實(shí)現(xiàn)
這篇文章主要介紹了基于Vue+element-ui 的Table二次封裝的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Intellij IDEA搭建vue-cli項(xiàng)目的方法步驟
這篇文章主要介紹了Intellij IDEA搭建vue-cli項(xiàng)目的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
Vue3虛擬列表的實(shí)現(xiàn)原理與實(shí)戰(zhàn)指南
在日常開發(fā)中,我們經(jīng)常會(huì)遇到需要展示大量數(shù)據(jù)的場(chǎng)景,比如展示幾千條甚至上萬(wàn)條數(shù)據(jù)列表,如果直接將所有數(shù)據(jù)渲染到頁(yè)面中,會(huì)導(dǎo)致嚴(yán)重的性能問(wèn)題,虛擬列表正是為了解決這一問(wèn)題而誕生的技術(shù),本文將介紹虛擬列表的核心原理,并基于 Vue3 手寫一個(gè)完整的虛擬列表組件2026-03-03

