解决label 和checkbox点击事件触发两次问题

问题描述

最近在做项目是遇到自定义checkbox多选需求,点击label时,触发了两次点击事件

页面元素
 <div class="multi-list hasTip bb pb-10">
     <div class="tit c6">机构属性:</div>
     <div class="mulit-item" id="institution">
         <label class="checkBtn checkBtn-default mr-10">
           <input class="checkbox" type="checkbox"  value="银行个贷">银行个贷
        </label>
         <label class="checkBtn checkBtn-default mr-10">
           <input class="checkbox" type="checkbox"  value="消费金融">消费金融
        </label> 
        <label class="checkBtn checkBtn-default mr-10">
            <input class="checkbox" type="checkbox"  value="典当行">典当行
       </label>
        <label class="checkBtn checkBtn-default mr-10">
           <input class="checkbox" type="checkbox"  value="信贷中介">信贷中介
       </label>
    </div>
</div>
点击事件
 $(".multi-list").on("click","label.checkBtn",function(){
      if($(this).hasClass("selected")){
         console.log("删除");
         $(this).removeClass("selected");
       }else{
         console.log("选中");
         $(this).addClass("selected");
       }
    })

看下图,神奇的事情发生了!!!竟然label没有选中的样式,还 把 “选中” 和 “删除” 都给我打印出来了,同时满足这两个矛盾的条件是不可能的,那到底是什么原因呢?

1504260965(1).png
原因:原来是label和input标签嵌套,点击label的时候,事件冒泡一次,同时会触发关联的input的click事件,导致事件再次冒泡,以至于自定义的复选框达不到我们想要的效果

点击label的时候打印“选中”,label添加class selected,当事件冒泡到input时,已经满足条件$(this).hasClass("selected"),打印“删除”,删除class selected,由于这个时间很短,这就是为什么我点击label没有给它添加样式了

那我们怎么解决呢?

方法一、对event.target进行判断
 $(".multi-list").on("click","label.checkBtn",function(event){
      if($(event.target).is('input')){//对点击目标元素做判断
        return;
      }
      if($(this).hasClass("selected")){
         console.log("删除");
         $(this).removeClass("selected");
       }else{
         console.log("选中");
         $(this).addClass("selected");
       }
    })
方法二、将事件绑定在input checkbox上,我们就不会触发label的click事件了
   $(".multi-list").on("click","input.checkbox",function(){
      if(!$(this).parent().hasClass('selected')){
         console.log("选中");
         $(this).parent().addClass("selected");
       }else{
         console.log("删除");
        $(this).parent().removeClass("selected");
       }
    })

我们可以看到下图已经有选中的样式了


1504262076(1).png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • HTML标签解释大全 一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(D...
    米塔塔阅读 8,672评论 1 41
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,477评论 19 139
  • 之前写过一篇浏览器事件的相关操作和事件运行的原理——JavaScript浏览器事件解析。这一篇主要写一些常用的事件...
    faremax阅读 5,565评论 0 0
  • 大学毕业后大家都朝九晚五上班 有的人三五年就做到了公司管理层 十来年已经成功创业财务自由 有的人一二十年依然在最底...
    东吴面馆老板阅读 1,807评论 0 0
  • 如何备战,就是推动更多人有机会参与预购,所以我们手上的lumi非常重要! 10月LUMI究竟要给谁??有几个标准给...
    卓越nu陈秋婵阅读 1,807评论 1 0