js(jquery)的on绑定点击事件执行两次的解决办法

js(jquery)的on绑定点击事件执行两次的解决办法—不是事件绑定而是事件冒泡

本文博主遇到的问题:jquery中用.on()给页面中新加的元素添加点击事件时,点击事件源,绑定的事件执行两次,这里的alert会执行两次,相应地数组删除也执行两次,具体代码如下(其中.tabDel是页面加载之后新生成的元素,故不能用普通的$(’.tabDel).click(function(){})的方法添加点击事件):

$('.right').on('click','.tabDel',function(){//删除所加 tab 节点的函数
            alert('tab的索引:'+$(this).parents('.contentLi2').index());
            var iNum1 = $(this).parents('.contentLi2').index();
            var iNum2 = $(this).parents('.anElement').index();
            $scope.module.tab[iNum1].fieldList.splice(iNum2,1);
            $(this).parents('.anElement').remove();
        });

上网找的解决方法大概有一下两种:
1、在用 on 绑定 click 事件之前,对该事件解绑,也就是

$('.right').off('click','.tabDel').on('click','.tabDel',function(){//删除所加 tab 节点的函数
            // alert('tab的索引:'+$(this).parents('.contentLi2').index());
            var iNum1 = $(this).parents('.contentLi2').index();
            var iNum2 = $(this).parents('.anElement').index();
            $scope.module.tab[iNum1].fieldList.splice(iNum2,1);
            $(this).parents('.anElement').remove();
        });

2、在on绑定的click事件执行之后进行解绑,用unbind(),即:

$('.right').on('click','.tabDel',function(){//删除所加 tab 节点的函数
            // alert('tab的索引:'+$(this).parents('.contentLi2').index());
            var iNum1 = $(this).parents('.contentLi2').index();
            var iNum2 = $(this).parents('.anElement').index();
            $scope.module.tab[iNum1].fieldList.splice(iNum2,1);
            $(this).parents('.anElement').remove();
        });
        $('.right .tabDel').unbind('clock');

然而,这也没有解决问题,我遇到的情况是这也写了之后,alert不执行了,原因是刚才说过:‘.tabDel’是页面上后来生成的元素,不能直接绑定事件,而unbind()的语法是:

$(selector).unbind(event,function)

所以我就开始找其他解决问题的办法,知道后来发现在on绑定事件的时候没有阻止冒泡,在代码中加入 return false 阻止冒泡之后,事件正常运行了,代码如下:

 $('.right').on('click','.tabDel',function(){//删除所加 tab 节点的函数
            // alert('tab的索引:'+$(this).parents('.contentLi2').index());
            var iNum1 = $(this).parents('.contentLi2').index();
            var iNum2 = $(this).parents('.anElement').index();
            $scope.module.tab[iNum1].fieldList.splice(iNum2,1);
            $(this).parents('.anElement').remove();
            return false;
        });

目前为止代码可以正常运行了,问题的元凶是冒泡,只是博主最开始找错了方向。
然而,阻止冒泡的方法并不止 return false 这一种,还有event.stopPropagation(),这两种方法是有区别的,简单来说:
event.stopPropagation()会阻止事件往上冒泡,但是并不阻止事件本身;
return false 则是既阻止了事件往上冒泡又阻止了事件本身。
欲详细了解这两种方法的区别,请查找相关资料。

希望此博客对您有所帮助!

个人微信公众号:侦探小禾子,闲聊育儿生活星座塔罗牌,野生法考通过者免费法律咨询,欢迎关注!
这里写图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值