Skip to content

点击input外部时,如何保持focus状态

场景

我在维护DatePicker组件时,发现鼠标在点击DatePicker弹框时,DatePicker组件的输入框并没有失去焦点, 按常理来说,DatePicker弹框部分和它的输入框部分不是嵌套关系,且这个DatePicker的弹框元素是追加在body元素的 尾部渲染的,所以点击DatePicker的弹框的任何地方,都应该算input的外部,它的输入框应该失去焦点才对。

分析

为了知道它是怎么实现这个效果,我试做分析,假如让我来实现点击input外部,不让input失去焦点,我会怎么做。那我可能会采用阻止 blur的默认事件,或者判断是否点击到input外部,如果是,重新触发元素的focus事件。但是通过查看代码,发现DatePicker并没有采用这两种方式。而是用了另一个方法,即在DatePicker弹框部分的最外层元素上,通过阻止mousedown的默认事件来实现的

总结

使用阻止mousedown默认事件的方式,对比阻止blur方案的好处是,不需要加额外标记,判断此处blur是否需要阻止。对比主动触发focus方案的 好处是,无需判断点击元素的包含关系,且如果为了实现input获取焦点的ui样式,而去触发focus会导致一些不必要的focus回调执行

苏ICP备20040768号