解决label标签包裹input后点击事件触发两次问题

10 篇文章 0 订阅
8 篇文章 0 订阅
本文介绍在Vue项目中如何正确处理label元素的点击事件,防止因默认行为导致的复选框状态更新问题。通过使用.prevent修饰符或e.preventDefault()方法,可以有效避免label点击时触发多次事件的问题。
摘要由CSDN通过智能技术生成

通常在为了使用户体验更好,在一些复选框或单选框和输入框中,会使用label包裹input这样用户只需点击后面文字,即可选中当前项。
代码结构如下

<ul 
class="table-main "  
@mouseenter.stop="myMouseenter(index)"
 :class="{'table-main-active':mouseIndex==index?true:false, 'table-main-actived':selectIndexArr.indexOf(index)!=-1?true:false}" 
 v-for="(detail,index) in details" 
 @click.stop="getIndex($event,index)">
    <!-- 只给ul绑点击事件点击li标签时只会触发li上的点击事件 点击label会触发label和input上的点击事件 -->
    <li class="w-sm fl">
        <!-- 只给input绑点击事件只会触发input上的点击事件 -->
        <input type="checkbox" v-model="selectIndexArr" :value="index" class="select" :id="`mycheck${index}`" />
        <!-- 只给label绑点击事件只会触发label上的点击事件 -->
        <label :for="`mycheck${index}`"></label>
    </li>
    <li class="w-sm fl">
        {{index+1}}
    </li>
</ul>

页面显示如下
在这里插入图片描述
当我点击li时能勾选上但是点击label时就勾选不上。然后打印发现点击label时触发了两次事件,很疑惑,明明只有一个点击事件。
原因:是使用label和input点击时会触发默认行为,会分别触发label和input上的点击事件导致勾选不上。
解决:label与其绑定元素的关系,当点击label时,浏览器会自动给被绑定元素也执行点击事件的行为,试了下用e.preventDefault(),发现果然阻止了这个默认行为。事件也就只被执行一次了。也可是判断是哪个标签上的事件如果是label上的事件就不继续执行,即只执行了一次

getIndex(e,index) {
            // if (e.target.tagName === 'LABEL') return // 因为原生click事件会执行两次,第一次在label标签上,第二次在input标签上,故此处理
            // e.preventDefault() // 阻止默认事件
            let that = this;
            if (that.selectIndexArr.indexOf(index) == -1) {
                that.selectIndexArr.push(index);
            } else {
                that.selectIndexArr.splice(that.selectIndexArr.indexOf(index), 1);
            }
        },

在vue中可以直接使用.prevent修饰符阻止默认事件,而不用去上面代码一样去e.preventDefault()或if (e.target.tagName === ‘LABEL’) return

 @click.stop.prevent="getIndex($event,index)"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值