Vue自定义组件--自动切换输入法的录入框-屏蔽输入法的录入框

Vue自定义组件: 自动切换输入法的录入框,屏蔽输入法的录入框,屏蔽中文输入法

vue3.5版本

<template>
  <div class="input-scan">
    <input v-model="model" class="text" :style="style" />
    <input v-model="model" class="pass" :style="style" id="input-scan-pass" ref="passRef" @keyup.enter="onKeyUpEnter"
      type="password" :name="randomName" autocomplete="off" />
  </div>
</template>
<script lang="ts" setup>
// 扫码输入框, 屏蔽中文输入法 autocomplete="new-password"  autocomplete="off":防止浏览器保存密码
defineOptions({
  name: 'InputScan'
})

const props = defineProps({
  style: {
    type: String,
    default: () => '',
  },
})
const emit = defineEmits(['onEnter']) // 监听回车事件
const model = defineModel({ default: ' ' }) // 放一个空格, 防止浏览器自动填充

const passRef = ref()
const randomName = ref('password_')

onMounted(() => {
  // 随机生成name, 防止浏览器自动填充(不是所有浏览器都有效)
  randomName.value = 'password_' + Math.random().toString(36).substring(2, 15)
})

const onKeyUpEnter = () => {
  emit('onEnter', model.value.trim())
  passRef.value.select()
}

</script>

<style scoped>
.input-scan {
  position: relative;
  height: 39px;
  width: 290px;
  margin: 10px;
}

.text,
.pass {
  top: 0;
  left: 0;
  position: absolute;
  width: 100%;
  height: 100%;
  box-sizing: border-box;
  /* 等宽字体 */
  font-family: 'Consolas', Courier, monospace;
  font-size: large;
  border-radius: 4px;
  padding: 8px;
}

.text {
  z-index: 1;
  border: 1px solid lightgray;
}

.pass {
  z-index: 2;
  border: 0px solid red;

  background-color: transparent;
  caret-color: black;
  color: transparent;
}

/* 选中后字体透明,蓝色背景50%透明 */
#input-scan-pass::selection {
  color: transparent;
  background-color: rgba(0, 0, 255, 0.5);
}

#input-scan-pass::-moz-selection {
  color: transparent;
  background-color: rgba(0, 0, 255, 0.5);
}
</style>

vue3版本

<template>
	<div class="input-scan">
		<input v-model="modelValue" class="text" :style="style" :class="class" />
		<input v-model="modelValue" class="pass" @keyup.enter.native="keyupEnter" type="password" :style="style"
			:class="class" />
	</div>
</template>
<script lang="ts" setup>
//扫码输入框,通过把一个透明的密码框放在普通输入框的上面,实现强制转换输入法为英文输入法的效果
import { computed } from 'vue'

defineOptions({
	name: 'InputScan'
})

const props = defineProps(['modelValue', 'style', 'class'])
const emit = defineEmits(['update:modelValue', 'keyup-enter'])

// 这里可以用const modelValue = useVModel(props, 'modelValue', emit)代替
const modelValue = computed({
	get() {
		return props.modelValue
	},
	set(value) {
		emit('update:modelValue', value)
	}
})

const keyupEnter = () => {
	emit('keyup-enter', modelValue.value)
}
</script>

<style scoped>
.input-scan {
	position: relative;
}

.text {
	position: absolute;
}

.pass {
	position: absolute;
	z-index: 999999;
	background-color: transparent;
	color: transparent;
}
</style>

vue2版本

利用透明的密码输入框实现自动切换到英文输入法, 在密码输入框下面再放一个文本, 同步显示明文

<template>
  <div id="HtmlInputScan">
    <input :value="value" @input="input" type="text" class="text">
    <input :value="value" @input="input" type="password" class="pass">
  </div>
</template>
<script>
export default {
  props: {
    value: {
      default: undefined
    }
  },
  methods: {
    // 实现双向绑定
    input(e) {
      this.$emit('input', e.target.value)
    }
  }
}
</script>
<style lang="scss" scoped>
#HtmlInputScan {
  position: relative;
  .text {
    position: absolute;
    top: 10px;
    left: 10px;
    width: 100%;
    font-family: Consolas, Monaco, monospace;
  }

  .pass {
    position: absolute;
    top: 10px;
    left: 10px;
    z-index: 999999; //密码框放上面才能自动切换到英文
    width: 100%;
    font-family: Consolas, Monaco, monospace;
    background-color: transparent;
    color: transparent;
  }
}
</style>

Vue2的双向绑定demo

HtmlInput.vue

<template>
  <div>
    <input :value="value" @input="input" type="text" >
  </div>
</template>
<script>
export default {
  props: {
    // 接收父组件传入的v-model的值
    value: {
      default: ''
    }
  },
  methods: {
    // 推送值给父组件v-model绑定的变量, 实现双向绑定
    input(e) {
      this.$emit('input', e.target.value)
    }
  }
}
</script>

使用示例

<template>
  <div>
        <html-input v-model="inputValue" />
  </div>
</template>

<script>
import HtmlInput from './HtmlInput.vue'
export default {
  components: {
    HtmlInput,
  },
  data() {
    return {
      inputValue: '123',
  },
}
</script>
当你需要将 Vue 前端应用与扫描枪结合工作时,通常是指通过浏览器访问页面,并利用连接到电脑或其他设备上的条码扫描器输入数据。这种场景下可以视为扫描枪作为一个特殊的键盘,在读取条形码信息后会自动将其内容发送给应用程序。 ### 实现步骤 1. **确定通信方式** - 如果是蓝牙或USB类型的物理硬件,则一般会被操作系统识别成HID(人机界面设备),即相当于外接了一个“键盘”。此时无需额外配置即可直接获取其录入的数据。 - 对于网络版、串口等非标准输入法接入形式的扫描仪来说,就需要根据产品手册提供的API文档来进行适配了。 2. **处理焦点元素** 因为大多数情况下的扫码操作都希望把结果填入特定文本内,所以你需要确保当用户准备开始扫描前该输入域已经获得光标聚焦状态。(可通过JavaScript控制) 3. **捕获并解析数据流** 当扫描完成后,整个字符串将会像普通键入一样传送到当前有激活态的HTML控件上;接下来就可以依据业务需求做进一步校验及逻辑判断啦! 4. **优化用户体验** 考虑加入一些视觉反馈机制,如成功接收后的提示音效或是改变样式来告知使用者系统正在响应动作。 5. **异常情形预案** 预留出应对错误编码格式或者是非法字符集的情况发生时的解决方案,避免造成程序崩溃等问题影响正常流程运转效率。 ```javascript // 示例代码片段用于监听某个input标签内的值变化事件,模拟简单地实现了对来自扫描枪的信息捕捉过程: <template> <div id="app"> <!-- 扫描区域 --> <input type="text" v-model="scanValue" @keyup.enter="handleScan"/> </div> </template> <script> export default { data() { return { scanValue: "" }; }, methods: { handleScan(event){ console.log("接收到扫描:", this.scanValue); // 清空输入以便下次继续使用 this.scanValue = ""; // 其他业务逻辑... } } }; </script> ``` --
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值