事件修饰符

事件修饰符主要用来处理 DOM 事件细节,如阻止事件冒泡、取消事件默认行为、修饰鼠标、修饰键盘等。

鼠标按键修饰

以鼠标修饰符举例,通常单击时可触发事件,我们可以将其设置成右击或者单击鼠标滚轮时触发事件,代码如下。

视图层代码如下。

<div id="app" v-cloak>
    <input type="button" value="单击" @click.right="show">
</div>

在 “@click” 后面加 “.right”,此时必须右击才能触发 show 方法,也可以将其设置为单击鼠标滚轮时触发,代码如下。

<div id="app" v-cloak>
    <input type="button" value="单击" @click.middle="show">
</div>

“.middle” 表示必须单击鼠标滚轮才能触发 show 方法。

系统修饰符

常用的系统修饰符有 .ctrl、.alt、.shift,其表示按住修饰键才能触发事件,代码如下。

<div id="app" v-cloak>
    <input type="button" value="单击" @click.ctrl="show">
</div>

上述代码必须在单击的同时按住 Ctrl 键,才能触发 show 方法,同理,.alt 修饰和 .shift 修饰的实现方法也是一样的。

事件修饰符

常用的事件修饰符有 .stop、.capture、.self、.prevent、.once。

.stop 阻止事件冒泡的代码如下。

视图层代码如下。

<div id="app" v-cloak>
    <div class="content" @click="sayhi">
        <div class="main" @click="show"></div>
    </div>
</div>

上述代码中,两个 div 盒子属于嵌套关系,并且都有事件,当单击 main 盒子时,首先会触发 show 方法,然后触发 sayhi 方法,这叫作事件冒泡,.stop 可以阻止事件冒泡,代码如下。

<!-- 使用 .stop 来阻止事件冒泡 -->
<div id="app" v-cloak>
    <div class="content" @click="sayhi">
        <div class="main" @click.stop="show"></div>
    </div>
</div>

此时单击 main 盒子,只会触发 show 方法。

capture 使用捕获模式,先触发外侧 div 事件,再触发内部 div 事件,代码如下。
<!-- 使用 .capture 来启用事件捕获 -->
<div id="app" v-cloak>
    <div class="content" @click.capture="sayhi">
        <div class="main" @click="show"></div>
    </div>
</div>

此时单击 main 盒子,首先触发的是 sayhi 方法,再触发 show 方法。

.self 单击元素本身触发事件,代码如下。

<!-- 使用 .self 仅在元素本身触发事件 -->
<div id="app" v-cloak>
    <div class="content" @click.self="sayhi">
        <div class="main" @click="show"></div>
    </div>
</div>

此时单击 main 盒子只能触发 show 方法,要触发 sayhi 方法则必须单击 content 盒子。

.self.stop 的区别:.self 只能阻止元素自身冒泡,如果还有其他嵌套事件,会继续冒泡;.stop 是阻止整个事件冒泡。

.prevent 阻止默认事件,代码如下。

<!-- 使用 .prevent 阻止跳转,并调用 show 方法 -->
<div id="app" v-cloak>
    <a href="http://www.baidu.com" @click.prevent="show">百度</a>
</div>

此时单击 “百度”,并不会跳转到百度页面,.prevent 阻止了 a 标签的跳转功能,打开控制台,控制台会调用 show 方法。

.once 修饰符只生效一次,代码如下。

<!-- 使用 .once 修饰符,只生效一次 -->
<div id="app" v-cloak>
    <a href="http://www.baidu.com" @click.prevent.once="show">百度</a>
</div>

第一次单击 “百度”,.prevent 会阻止 a 标签的默认跳转,所以不会进行页面跳转。但是第二次单击 “百度” 页面,则会正常跳转,加上 .once 之后,.prevent 修饰符只生效一次。