uni-app input标签type=number时 输入" - "负号后@input监听不到等BUG

uni-app input标签type=number时 输入" - "负号后@input监听不到等BUG

操作步骤:

  • 输入" - “负号后连续输入其他数字,然后清空内容后,重新输入” - "负号就会出现粘贴上次输入内容效果

预期结果:

  • v-model绑定的变量值实际不为空

实际结果:

  • v-model绑定的变量值实际为空

bug描述:

  1. input标签type=number的情况下,输入" - "负号后@input监听不到
  2. 输入" - “负号后连续输入其他数字,然后清空内容后,重新输入” - "负号就会出现粘贴上次输入内容效果,但v-model绑定的变量值实际为空
  3. 输入第一次" - “负号后,input内容为“ - ”,接着再次输入” - ",则input又为空
  4. 在所有机型,H5上都有这种情况

图片

Image 1 Image 2

附件

7 回复

提供可以复现的demo,方便排查


你好,看视频就大概可以复现了,直接写一个input标签即可复现

解决了吗,我也遇到这个问题了

我也遇到这个问题了

我也遇到了。。。。输入-号,监听事件没有被调用。。。 <input标签是写在<uni-transition标签里的。。。uniapp真是小问题不断啊

两年多了都没修复么 最新版input事件还是无法监听负号-的输入

在使用 uni-app 开发时,如果你在 input 标签中设置了 type="number",并且希望在输入负号时能够监听到输入事件,可能会遇到一些问题。这是因为 input 标签的 type="number" 在某些情况下对负号的处理方式与普通文本输入不同。

问题描述

inputtype="number" 时,输入负号 - 时,@input 事件可能不会触发,或者触发时获取到的值不正确。这是因为浏览器在处理 type="number" 的输入框时,会先验证输入的内容是否符合数字格式,如果不符合,可能会忽略或阻止输入。

解决方案

1. 使用 type="text" 并手动验证数字

如果你需要处理负号,并且不依赖 type="number" 的默认行为,可以将 type 设置为 text,然后手动验证输入内容是否为数字。

<template>
  <input type="text" v-model="inputValue" @input="handleInput" />
</template>

<script>
export default {
  data() {
    return {
      inputValue: ''
    };
  },
  methods: {
    handleInput(event) {
      const value = event.target.value;
      // 手动验证是否为数字(包括负号)
      if (/^-?\d*\.?\d*$/.test(value)) {
        this.inputValue = value;
      } else {
        // 如果不符合数字格式,可以清空或保留上一次的有效值
        this.inputValue = this.inputValue;
      }
    }
  }
};
</script>

2. 使用 type="number" 并监听 @change 事件

如果你仍然希望使用 type="number",可以尝试监听 @change 事件,而不是 @input 事件。@change 事件在输入框失去焦点时触发,可能会更可靠地获取到最终的值。

<template>
  <input type="number" v-model="inputValue" @change="handleChange" />
</template>

<script>
export default {
  data() {
    return {
      inputValue: ''
    };
  },
  methods: {
    handleChange(event) {
      this.inputValue = event.target.value;
    }
  }
};
</script>

3. 使用 [@keydown](/user/keydown) 事件监听负号输入

你还可以通过监听 [@keydown](/user/keydown) 事件来捕获负号的输入,并在事件处理函数中手动处理。

<template>
  <input type="number" v-model="inputValue" [@keydown](/user/keydown)="handleKeydown" />
</template>

<script>
export default {
  data() {
    return {
      inputValue: ''
    };
  },
  methods: {
    handleKeydown(event) {
      if (event.key === '-') {
        // 手动处理负号输入
        this.inputValue = '-' + this.inputValue;
      }
    }
  }
};
</script>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!