扫码枪在中文输入法时扫码冲突

1,322 阅读1分钟

扫码枪在扫完码时会自动回车,这时如果是中文输入法就会触发输入法联想,再加一个回车,那么input框输入的就成中文了。如果可以控制input框只能输入英文那就好了。css有一个属性(ime-mode)轻松就可以解决,但可惜的是该属性只能在IE浏览去有效,webkit内核浏览器不支持,放弃!

<input type="text" style="ime-mode:disabled"/>

文本框当type=password时,输入法就是英文,但是显示的是一堆点点点。所以要想办法让用户在password框中只能输入英文,但是看到的确是正常的文本框。

思路:

1、分两层,底层是一个password文本框,在它正上方放一个div用于正常显示输入的内容;

2、password文本框的字体设成白色或者透明,重新设置光标颜色;

3、使用pointer-events: none让div的鼠标事件穿透到input框产生focus事件;

4、使用等宽字体monospace让光标闪烁的位置符合预期

代码如下,基于elementUI
html
<el-form ref="formRingCode" :inline="true" :model="formRingCode" :rules="rules" @submit.native.prevent>
        <el-form-item label="手环码" prop="ringCode">
          <el-input ref="ringCode" v-model="formRingCode.ringCode" :maxlength="8" type="password" placeholder="请将光标聚焦于此,等待读取手环" class="w350 input-original" />
          <div class="w350 input-backup">{{ formRingCode.ringCode }}</div>
        </el-form-item>
</el-form>
css
.input-backup{
  position: absolute;
  left: 0;
  pointer-events: none;
  border-radius: 4px;
  box-sizing: border-box;
  color: #606266;
  display: inline-block;
  height: 40px;
  line-height: 40px;
  outline: 0;
  padding: 0 15px;
  font-family: monospace;
}
.input-original input{
  color: white;
  caret-color: #606266;
  font-family: monospace;
  &::placeholder {
    font-family: Helvetica Neue;
  }
  &::selection{
    color: white;
  }
}
效果图:

2023-05-24_225034.png