html中label标签radio,click事件在label标签的checkbox、radio中执行2次

当HTML label标签包含input时,点击label会触发input的click事件,导致事件执行两次。这是因为事件冒泡机制,input的click事件冒泡到label,从而调用处理函数两次。解决方案包括将ng-click绑定到input上或阻止事件冒泡,但后者可能影响label的正常功能。
摘要由CSDN通过智能技术生成

这是2个月前遇见的事,前一阵有人问我,便想着要记下来。以下叙述不仅针对于angularJs的ng-click事件,对普通的click事件也适用。

示例一:

js中是这么写的:

$scope.checkGoods = function(index){

$scope.items[index].isChecked = !$scope.items[index].isChecked;

}

视觉感受是click事件无效了,因为.wait_check的class没有变化,item.ischecked的值也没有变化。分布调试后,发现其实是执行了2次checkGoods(),也就是ng-click事件被执行了2次。

元素默认绑定click事件

一些元素如、、本生就默认绑定了click事件,即使你不绑定,click事件发生时他们也会接收到。

当label标签包含input时,label也自动监听原来input默认监听的事件。

事件冒泡

我们知道事件传递方式有2种:事件捕获和事件冒泡。事件会从父元素传到子元素,再从子元素传到父元素,如果事件绑定发生在父元素传到子元素的过程中,则称为事件捕获传递,如果事件绑定发生在子元素传到父元素的阶段,则称为事件冒泡传递。

由于父元素包含子元素,子元素属于父元素,所以在子元素上的操作就相当于在父元素上的操作,譬如#parent绑定了click事件,则点击子元素#child,会自然的触发原本绑在#parent上的click事件。准确的说这其实是子元素继承了父元素的事件,使子元素父元素绑定了相同的事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值