html中a标签的事件,父元素a标签的href默认行为以及子元素绑定的click事件的响应之间存在影响...

背景

开发过程中遇到问题,简单写个demo 运行环境为Chrome 68

描述一下这个问题,当a标签内部存在嵌套时, 父元素a标签的href默认行为以及子元素绑定的click事件的响应之间存在影响。页面结构:

a标签内部点击事件失效

* {

margin: 0;

padding: 0;

}

.father {

display: block;

width: 500px;

height: 200px;

background-color: rgb(210, 111, 30);

}

.child-one {

display: block;

width: 200px;

height: 50px;

background-color: rgb(174, 43, 226);

}

.child-two {

display: block;

width: 200px;

height: 50px;

background-color: rgb(43, 226, 67);

}

.child-three {

display: block;

width: 200px;

height: 50px;

background-color: rgb(43, 137, 226);

}

父标签

子标签1

子标签2

子标签3

let father = document.querySelector('.father');

let ele1 = document.querySelector('.child-one');

let ele2 = document.querySelector('.child-two');

let ele3 = document.querySelector('.child-three');

ele1.addEventListener('click', function (e) {

e.stopPropagation();

// e.preventDefault();

alert('click child-one')

window.location.href = 'child-one'

}, false)

ele2.addEventListener('click', function (e) {

e.stopPropagation();

alert('click child-two')

// window.location.href='child-two'

}, false)

ele3.addEventListener('click', function (e) {

alert('click child-three')

window.location.href = 'child-three'

}, false)

father.addEventListener('click', function (e) {

alert('click father')

window.location.href = 'father'

}, false)

示例如下图(如果a标签嵌套,浏览器解析错误,所以用object标签包裹了一层)。

1460000015921350?w=760&h=486

执行操作:

当点击父标签时,先弹出111,然后跳转父标签的href链接。

说明onclick执行先于href

当点击child-one时,执行元素绑定的click事件,会弹出alert,但是location仍然跳转到了father。

阻止冒泡后,执行结果仍然不符合预期。添加preventDefault之后,执行了子元素自己的跳转。

当点击child-two时,弹出响应信息,然后会跳转href的链接。

当点击child-three时,先弹出click child-three,然后是href child-three,说明click事件先于href执行。

上面4个操作除了2之外都很好理解,2中,为什么已经在阻止了事件冒泡之后,仍然执行了父元素中href的跳转。

思考:

首先可以肯定的是,事件冒泡确实被阻止了,因为父元素的onclick并没有执行。

所以猜测,标签的默认行为是无法通过取消冒泡来阻止的,就算事件没有冒泡到父元素,子元素在父元素标签内部,仍然会执行标签默认行为。

解决方法:

在子元素中添加e.preventDefault()阻止默认行为

父元素不使用标签,使用其他标签绑定click事件且子元素阻止冒泡

父元素不使用href属性,直接在标签上绑定click事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值