子节点含有表单元素的div元素的blur事件

1.div元素的blur事件

blur事件一般在表单元素如input元素才是存在的,对div、span等元素时无效的,但是可以给div元素加上tabindex属性,也可以让div等元素有焦点,所以blur事件就有效了,如:

    <div id="divblur" tabindex="2">
        <span>类型:</span>
    </div>

    document.querySelector('#divblur').addEventListener('blur', function(e){
        console.log('blur event')
    })

点击div元素,就会触发blur事件,控制台会打印日志 "blur event"

但是,会有一个问题,由于添加了‘tabindex’属性,当你点击div元素的时候,div元素周围会有一个蓝色的焦点轮廓,如下图:

这样对有些人来说是不可接受的,那么怎么把它去掉呢,很简单,直接在div元素上加上'outline: none' 的样式就可以了。如:

    <style>
        #divblur{
            outline: none;
        }
    </style>

2.子节点含有表单元素如input元素的div的blur事件

如果你有这样的需求:div元素包裹有input元素,当你在input框中输入一些文本后,点击这个div元素区域外侧,这时你想让整个div失去焦点触发blur事件,在blur事件中进行一些逻辑处理。但是你直接给div绑定blur事件,或者给div加上tabindex属性然后再绑定blur事件,你发现都不会触发div元素的blur事件。

    <div id="divblur" tabindex="2">
        <span>div元素的blur事件</span>
        <input type="text" />
    </div>

    document.querySelector('#divblur').addEventListener('blur', function(e){
        console.log('blur event')
    })

这是因为blur事件不支持冒泡,你在input中输入文字后,然后点击外侧区域失去焦点,此时如果input元素绑定了blur事件,就会触发该事件,但是不会冒泡到父元素div上,也就不会触发blur事件。

那么,有什么办法可以达到目的呢,有两种方法:

(1)既然blur事件不支持冒泡, 那就启用捕获,在捕获阶段触发div的blur事件

    <div id="divblur" tabindex="2">
        <span>div元素的blur事件</span>
        <input type="text" />
    </div>
    // 第三个参数设为true,开启捕获
    document.querySelector('#divblur').addEventListener('blur', function(e){
        console.log('blur event')
    }, true)

(2)使用focusout事件替代blur事件,focusout事件和blur事件基本上效果是一样的,不同的是,focusout事件支持冒泡。

    <div id="divblur" tabindex="2">
        <span>div元素的blur事件</span>
        <input type="text" />
    </div>
    // focusout事件代替blur事件
    document.querySelector('#divblur').addEventListener('focusout', function(e){
        console.log('blur event')
    })

最后需要说明的是,这两种方法,div元素tabindex属性都需要加上,因为div本身没有焦点属性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值