当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何解决格式化input的值导致光标位置?

赵禄
2023-10-31

大佬们,二次封装了vant的组件,主要效果是用户输入的银行卡号自动4位分割出来一个空格,给后端提交数据的时候呢又是去掉空格的,功能是没问题,但是如果在input中间添加或者删除内容时光标会自动跳到末尾去,如何计算光标位置太难了,求助大佬们,非常感谢

<template>  <van-field    v-model="innerValue"    v-bind="$attrs"    v-on="$listeners"  >    <template v-for="(index, name) in $slots" :slot="name">      <slot :name="name" />    </template>  </van-field></template><script>export default {  inheritAttrs: false,  model: { event: 'filtered' },  props: {    value: { default: '' },  },  data() {    return {}  },  computed: {    innerValue: {      get() {        return this.value.replace(/\D/g, '').replace(/(\d{4})(?=\d)/g, '$1 ')      },      set(value) {        this.$emit('filtered', value.replace(/\D/g, ''))      }    }  },  methods: {}}</script>

共有1个答案

骆英纵
2023-10-31
<template>  <van-field    v-model="innerValue"    v-bind="$attrs"    v-on="$listeners"    ref="inputField"  >    <template v-for="(index, name) in $slots" :slot="name">      <slot :name="name" />    </template>  </van-field></template><script>export default {  inheritAttrs: false,  model: { event: 'filtered' },  props: {    value: { default: '' },  },  data() {    return {      oldFormattedValue: ''  // 保存上一个格式化值    }  },  computed: {    innerValue: {      get() {        return this.value.replace(/\D/g, '').replace(/(\d{4})(?=\d)/g, '$1 ')      },      set(value) {        const newValue = value.replace(/\D/g, '');        this.$emit('filtered', newValue);        this.adjustCursorPosition(newValue);        this.oldFormattedValue = this.innerValue;      }    }  },  methods: {    adjustCursorPosition(newValue) {      const input = this.$refs.inputField.$el.querySelector('input');      const oldPos = input.selectionStart;            // 计算旧格式化值和新格式化值之间的差异      const oldFormattedValueDiff = this.oldFormattedValue.slice(0, oldPos).split(' ').length - 1;      const newFormattedValueDiff = this.innerValue.slice(0, oldPos + oldFormattedValueDiff).split(' ').length - 1;      const diff = newFormattedValueDiff - oldFormattedValueDiff;      // 调整光标位置      const newPos = oldPos + diff;      input.setSelectionRange(newPos, newPos);    }  }}</script>
 类似资料:
  • 问题内容: 在JavaScript中,如何格式化日期对象以打印为? 问题答案: 对于自定义分隔的日期格式,你必须从DateTimeFormat对象(属于ECMAScript Internationalization API的一部分)中提取日期(或时间)组件,然后手动使用所需的分隔符创建字符串。 为此,你可以使用DateTimeFormat#formatToParts: 你还可以使用来一对一地提取各

  • 问题内容: 在JavaScript中,从浮点数转换为字符串时,小数点后仅能获得2位数字吗?例如,用0.34代替0.3445434。 问题答案: var result = Math.round(original*100)/100; 具体细节,以防代码不言自明。 编辑:…或按照TimBüthe的建议使用。忘了那个,谢谢(和赞扬):)

  • 在JavaScript中,大家都知道著名的计算:。但是为什么JavaScript打印这个值,而不是打印更精确、更精确的呢?

  • 严重:web应用程序创建了一个ThreadLocal,其键类型为[org.apache.log4j.helpers.ThreadLocalMap](值为[org.apache.log4j.helpers.ThreadLocalMap@3ac5b23e])和值类型为[java.util.Hashtable](值为[{userhost=192.168.15.90,userid=127,username

  • 您是否碰巧知道如何返回(并进一步返回)到Visual Code Editor中以前的光标位置? 到目前为止,我所做的只是快速的“撤消”和“重做”,只是为了看看我在哪里,但这不仅是愚蠢的,而且非常有限,因为它可以回到最后一个光标位置,而不是无法进一步返回。 用例场景: < li>1)您在1号线,在那里做了一些事情。 < li>2)然后,您转到第100行,并在那里做了其他事情。 < li>3)您转到第

  • 本文向大家介绍详解JavaScript时间格式化,包括了详解JavaScript时间格式化的使用技巧和注意事项,需要的朋友参考一下 感谢某前辈写的JS格式化日期和时间JS代码,很好很强大!!! 前言:   js虽然提供了各种获取时间Date对象的不同属性方法,如:getDate 方法 | getDay 方法 | getFullYear 方法 | getHours 方法 ... ... 等等,但是却