js事件——点击事件与失焦事件冲突解决

本文探讨了前端开发中遇到的事件冲突问题,特别是在处理输入框的blur事件与点击事件时出现的问题,并提出了一种通过事件冒泡来解决该问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端菜鸟,哈哈哈,在练习的过程中,遇到了事件冲突问题,并通过薅头发的方法得以解决,希望通过和大佬们进行讨论,学习一下是否有更好的解决方法

问题

如豆瓣搜索框,在搜索时,会显示一个下拉列表,这个时候如果点击搜索框外面,会触发blur事件,下拉列表隐藏;如果点击下拉列表,则会跳转到相应的页面,在练习过程中,这个环节出了一些问题,我的部分代码如下

$('input').on('blur',function(e){
    $('list').css({display:'none'})
})
复制代码

结果在点击下拉列表的时候无法进行跳转(在下拉列表中有a标签包裹,所以利用默认事件进行跳转页面)

分析问题

通过分析可以知道整体操作只与click事件和blur事件有关,故此判断触发顺序

$('input').on('blur',function(e){
    console.log(1)
})
$('a').on('click',function(e){
    console.log(2)
})
// 输出结果
//1
//2
复制代码

由此可知,先触发了blur事件,然后触发了click事件,所以,在blur事件中使list的display:none;就会在触发click事件之前把a隐藏,这样的话,就无法点击a标签,进而无法触发点击事件

解决方法

利用事件冒泡,首先无论如何blur事件一定先触发,所以隐藏list不能在blur事件中处理,那么应该在click事件中处理,又因为不能单单在a标签中处理(否则点击页面其他部分触发blur事件时就无法使list隐藏),所以利用事件冒泡,在body上进行隐藏处理,代码如下:

$('body').on('click',function(e){
    if(e.target.tagName!=='INPUT'){
        $('list').css({display:'none'});
    }
})
复制代码

通过判断事件源如果不是点击输入框,就可以判断为点击到了外部,此时会默认触发blur事件,而且会使list隐藏;如果点击的是输入框,则不隐藏list

头一回在掘金上写(其实在哪里都没怎么写过,哈哈哈),还请大佬指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值