6月29晚上说的是第二天再书写修饰符
结果是今天才进行更新................
昨天上海地铁出现问题,好多人.... 好拥挤..... 但是看一看公交:等待首站发车........
还是乖乖等待地铁..........
一:事件修饰符
1:阻止单击事件继续传播(阻止冒泡) .stop
下面看一下最开始写的代码
<template>
<div>
<h1 v-on:click.stop="dothis">阻止单击事件</h1>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
dothis(e){
this.count++
console.log("阻止单击事件",e,this.count)
}
}
};
</script>
<style lang="sass" scoped>
</style>
出现的结果:每次点击都会成功
想一想“阻止单击事件继续传播”为什么没有阻止为什么会成功
查一查看一看 是自己理解错误导致结果出现问题
这样写好像是没有什么问题
<template>
<div>
<h1 v-on:click="just">第一次点击事件</h1>
<h1 v-on:click.stop="dothis">阻止单击事件</h1> </div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
just(){
console.log("第一次点击事件")
},
dothis(e){
this.count++
console.log("阻止单击事件",e,this.count)
}
}
};
</script>
<style lang="sass" scoped>
</style>
但是结果是 并没有阻止 依然在继续执行
“阻止单击事件继续传播”的意思就是 :"阻止事件冒泡”
事件冒泡:当一个元素上的事件被触发的时候,鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。
只单击内部就会触发外部和元素上绑定的click事件,这就是由事件冒泡所引起的。只单击元素的同时,也单击了包含元素的元素和包含元素的元素元素,并且每一个元素都会按照特定的顺序响应click事件。
事件冒泡的过程:h1dothis这个元素 ---》 h1just这个元素 h1dothis冒泡到 h1jsust这个
<template>
<div>
<h1 v-on:click="just">
<h1 v-on:click.stop="dothis">阻止单击事件</h1>
</h1>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
just(){
console.log("第一次点击事件")
},
dothis(){
this.count++
console.log("阻止单击事件",this.count)
}
}
};
</script>
<style lang="sass" scoped>
</style>
这样就没有问题 已经阻止单击事件继续传播
2:提交事件不再重载页面(取消默认事件) .prevent
<form v-on:sumbime.prevent="xxx"></form> // @submit.prevent
<template>
<div>
<form v-on:submit.prevent="dothis('hhhh')" action="">
<input type="text" >
<button type="submit">提交</button>
</form>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
dothis(mes){
this.count++
console.log("提交事件不再重载页面",this.count)
},
}
};
</script>
<style lang="sass" scoped>
</style>
下面a标签会进行指定页面的跳转而且是新开的页面 @clicl.prevevt之后会取消跳转而且新开页面
<template>
<div>
<a href="http://www.hao123.com" target="_blank" @click.prevent>点击</a>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
dothis(mes){
this.count++
console.log("提交事件不再重载页面",this.count)
},
}
};
</script>
<style lang="sass" scoped>
</style>
3修饰符串联
阻止事件冒泡及默认事件
<template>
<div>
<h1 v-on:click="just">
<a href="http://www.hao123.com" target="_blank" @click.stop.prevent="dothis">点击</a>
</h1>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
just(){
console.log("第一次点击事件")
},
dothis(){
this.count++
console.log("阻止事件冒泡及阻止默认事件",this.count)
}
}
};
</script>
<style lang="sass" scoped>
</style>
结果:既不进行转跳也不进行冒泡
进行冒泡但不进行默认事件
<template>
<div>
<h1 v-on:click="just">
<a href="http://www.hao123.com" target="_blank" @click.prevent="dothis">点击</a>
</h1>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
just(){
console.log("第一次点击事件")
},
dothis(){
this.count++
console.log("阻止事件冒泡及阻止默认事件",this.count)
}
}
};
</script>
<style lang="sass" scoped>
</style>
结果
不进行冒泡但是进行默认事件 不触发冒泡但是进行页面转跳而且是新开的页面
<template>
<div>
<h1 v-on:click="just">
<a href="http://www.hao123.com" target="_blank" @click.stop="dothis">点击</a>
</h1>
</div>
</template>
<script
export default {
data(){
return{
count:0
}
},
methods:{
just(){
console.log("第一次点击事件")
},
dothis(){
this.count++
console.log("阻止事件冒泡及阻止默认事件",this.count)
}
}
};
</script>
<style lang="sass" scoped>
</style>
.capture
添加事件监听器时使用事件捕获模式
内部元素触发的事件先在此处理 然后才交由内部元素进行处理
在vue中,当我们添加了事件修饰符capture后,才会变成捕获监听器
<template>
<div>
<h1 v-on:click="just">
第一层
<h1 v-on:click.capture="just2">
第二层
<h1 v-on:click="just3">
第三层
<h1 v-on:click="just4">
第四层
</h1>
</h1>
</h1>
</h1>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
just(){
console.log("第一层点击事件")
},
just2(){
console.log("第二层点击事件")
},
just3(){
console.log("第三层点击事件")
},
just4(){
console.log("第四层点击事件")
},
}
};
</script>
<style lang="sass" scoped>
</style>
正常情况下(冒泡)的顺序为:h4-->h3-->h2-->h1 (从里往外)
但是现在的情况是 先执行.capture 然后在由里向外冒泡
点击第四层 出现的顺序为:h2-->h4-->h3-->h1
点击第三层 出现的顺序为:h2-->h3-->h1
点击第二层 出现的顺序为:h2-->h1
点击第一层 出现的顺序为:h1
捕获的顺序为:从上往下
冒泡的顺序为:从下往上
.capture影响了嵌套的执行顺序
现在阻止冒泡
<template>
<div>
<h1 v-on:click="just">
<h1 v-on:click.capture.stop="just2">
<h1 v-on:click="just3">
<h1 v-on:click="just4">第四层</h1>
</h1>
</h1>
</h1>
</div>
</template>
<script>
export default {
data() {
return {
count: 0
};
},
methods: {
just() {
console.log("第一层点击事件");
},
just2() {
console.log("第二层点击事件");
},
just3() {
console.log("第三层点击事件");
},
just4() {
console.log("第四层点击事件");
}
}
};
</script>
<style lang="sass" scoped>
</style>
结果是 触发的是第二个h1的点击事件
除了第一层(第一层没有冒泡 所以不会阻止冒泡) 触发的永远都是h2
<template>
<div>
<h1 v-on:click="just">
第一层
<h1 v-on:click.capture.stop="just2">
第二层
<h1 v-on:click="just3">
第三层
<h1 v-on:click="just4">第四层</h1>
</h1>
</h1>
</h1>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
just(){
console.log("第一层点击事件")
},
just2(){
console.log("第二层点击事件")
},
just3(){
console.log("第三层点击事件")
},
just4(){
console.log("第四层点击事件")
},
}
}
</script>
<style lang="sass" scoped>
</style>
.self
只有在event.target是当前元素自身时触发处理函数
事件不是从从内部触发
<template>
<div>
<h1 v-on:click="just">
第一层
<h1 v-on:click.self="just2">
第二层
<h1 v-on:click="just3">
第三层
<h1 v-on:click="just4">第四层</h1>
</h1>
</h1>
</h1>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
just(){
console.log("第一层点击事件")
},
just2(){
console.log("第二层点击事件")
},
just3(){
console.log("第三层点击事件")
},
just4(){
console.log("第四层点击事件")
},
}
};
</script>
<style lang="sass" scoped>
</style>
正常情况下(冒泡)的顺序为:h4-->h3-->h2-->h1
但是现在的情况是 不执行有.self这个事件( 如果是冒泡传递上来的事件不触发自身事件) 然后再由里向外冒泡
点击第四层 出现的顺序为:h4-->h3-->h1
点击第三层 出现的顺序为:h3-->h1
点击第二层 出现的顺序为:h2 -->h1(点击到了自身)
点击第一层 出现的顺序为:h1
.once
点击事件将只会触发一次
<template>
<div>
<h1 @click.once="dothis">点击事件只会触发一次</h1>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
dothis(){
console.log("点击事件只会触发一次")
},
}
};
</script>
<style lang="sass" scoped>
</style>
结果: 点击第二次便会无效
结果:阻止跳转到百度页面只能一次 第二次的时候依然可以跳转
<template>
<div>
<a href="http://www.hao123.com" @click.prevent.once>点击跳转</a>
</div>
</template>
<script>
export default {
data(){
return{
count:0
}
},
methods:{
}
};
</script>
<style lang="sass" scoped>
</style>
.passive
执行默认方法
意思就是:每次事件产生,浏览器都会去查询一下是否有preventDefault阻止该次事件的默认动作。加上passive就是为了告诉浏览器,不用查询,我们没用preventDefault阻止默认动作。
preventDefault:取消事件的默认动作