参考文章:https://blog.csdn.net/ligang2585116/article/details/51764828
密码输入框通常会有切换明文/密文的功能,开发时遇到了问题:点击眼睛图标会占用input的焦点并关闭软键盘,这样体验较差,然后就慢慢解决吧(ps:顺便@一下tb:淘宝h5登录页点击密码的小眼睛也会关闭软键盘的,所以这次之后,大家在某些领域已经超越淘宝了 hhh)
最开始点击眼睛图标时,切换眼睛图标,input控件会失去焦点,并且软键盘关闭
所以在click事件时设置了一个300毫秒的延时让input重新获取焦点,可是每次点击图标,即使调用了input.focus还是会关闭软键盘。。。后来请教了一位大神,学习了label标签,关于label标签的解读和用法如下
然后,就没有什么难点了,部分代码如下
<input
:type="inputType"
:placeholder="currPlaceholder"
v-model="currentValue"
:maxlength="currMaxength"
:disabled="disabled"
@input="handleInput"
@focus="handleFocus"
@blur="handleBlur"
@change="handleChange"
ref="input"
id="password"
/>
<label
v-if="currPassword"
for="password"
@click="handlerEyeClick">
<img
style="margin-left:10px;width:18px;height:18px" :src="eyeSrc" />
handlerEyeClick() {
this.blurBecauseClick = true;
//eyeSrc会根据eyeOpen计算
this.eyeOpen = !this.eyeOpen;
const { input } = this.$refs;
setTimeout(() => {
input.focus();
}, 300);
},
其中handlerEyeClick中有一个标志blurBecauseClick会在点击时置为true,因为项目中password输入框在失去焦点时,会校验输入合法性,点击眼睛图标会设置一个标志,使得此次引发的blur事件回调时不校验合法性,重置标志位,然后直接return
而且,click事件会在input的blur事件之后回调,所以,handlerEyeClick前置绑定在了label的mousedown事件,最终label标签如下:
<label
v-if="currPassword"
for="password"
@mousedown="handlerEyeClick">
至此,已经很完美了,效果图涉及公司项目,就不贴了