点击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
回调执行