在Vue中,關於事件冒泡
阿新 • • 發佈:2019-02-02
在專案中或多或少都會遇見關於事件冒泡的問題。
什麼是事件冒泡:
對於父元素的事件,你的子元素也會觸發,可以理解為父債子還。
對於我們而言,經常會有不想讓某個子元素去觸發父元素的事件,也就是說,上一輩欠的錢,別來找我要。
這個時候我們就需要來阻止事件冒泡了。
一般情況我們這樣來實現:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="style.css">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
function doSometing(obj,evt){
alert(obj.id);
// 做瀏覽器相容
var e = (evt)? evt:window.event; //獲取IE或非IE瀏覽器的事件
if (window.event) { //如果是IE瀏覽器
e.cancelBubble = true; //IE瀏覽器,設定該屬性為true,取消事件冒泡
}else{
e.stopPropagation(); //非IE瀏覽器,該方法取消事件的進一步捕獲或冒泡。
}
}
</script>
</head>
<body>
<div id="parent1" onclick="alert(this.id);" style="width: 250px;background-color: #cacaca">
<p>This is parent1 div</p>
<div id="child1" onclick="alert(this.id);" style="width: 200px;background-color: orange">
<p>This is child1.Will bubble.</p>
</div>
</div>
<br>
<div id="parent2" onclick="alert(this.id);" style="width: 250px;background-color: cyan;">
<p>This is parent2 div</p>
<div id="child2" onclick="doSomething(this,event);" style="width: 200px;background-color: #aeaeae">
<p>This is child2.</p>
</div>
</div>
</div>
</body>
</html>
而在Vue中,我們則有一個內容叫做事件修飾符:
事件修飾符
在事件處理器中經常需要呼叫 event.preventDefault() 或 event.stopPropagation()。儘管我們在方法內可以輕鬆做到,不過讓方法是純粹的資料邏輯而不處理 DOM 事件細節會更好。
為了解決這個問題,Vue.js 為 v-on 提供兩個 事件修飾符:.prevent 與 .stop。你是否還記得修飾符是點號打頭的指令字尾?
<!-- 阻止單擊事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再過載頁面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修飾符可以串聯 -->
<a v-on:click.stop.prevent="doThat">
<!-- 只有修飾符 -->
<form v-on:submit.prevent></form>