vue input获取光标位置,并追加内容

项目中需要实现在输入框内的任意位置,追加内容,这里通过input的selectionStart属性还有setSelectionRange方法来实现。

首先来看selectionStart属性,用于获取文本框选区的开始位置,selectionEnd用于获取文本框选区结束的位置,举个栗子:

在该功能中,我们不是选择文字,主要是需要获取光标的位置,不选中文字时selectionStart和selectionEnd属性的值是一样的。

再看setSelectionRange方法,它也是作用在input元素上的,可以通过设置起始和终止位置,来选中一段文本中的一部分,inputElement.setSelectionRange(selectionStart, selectionEnd, [optional] selectionDirection),还可以选择方向。当起始位置和终止位置一样时,就相当于是改变输入框中光标的位置了。

看一下具体实现:

代码如下:

async insertContent(val){
   let dom = this.$refs.textareaI.$refs.textarea;
   // console.dir(dom);
   let index  = dom.selectionStart;
   let contont = dom.value;
   this.textarea = contont.substring(0,index) + val + contont.substring(index,contont.length)
   await this.$nextTick();
    dom.focus();
    dom.setSelectionRange(index + val.length,index + val.length)
},

需要注意几点:一定要等到dom更新完成后再去改变光标的位置;

再讲一个小tips:

不论是vue中ref获取的元素节点,或者通过原生获取的节点,当我们想要查看元素节点的属性时,可以通过这三个方法查看:

  1. 包数组:console.log([dom])

  1. 包对象:console.log({dom})

  1. 使用console.dir打印,可以打印出该对象的所有属性和属性值。

在Ant Design Vue (ant-design-vue) 中,`a-input`组件默认的行为可能是基于浏览器的文本框渲染规则,当你手动将光标移动到最前面输入文字时,它可能会自动将新内容添加到输入框的末尾,尤其是在没有特殊处理的情况下。 这种情况通常发生在焦点改变后,由于浏览器为了保持用户输入历史记录而采取的行为。如果你希望新输入的内容始终显示在光标位置,而不是追加到末尾,你可以尝试通过以下几种方式解决: 1. **监听`onInput`事件**: 使用Vue的`@input`事件,当输入发生时,手动设置`value`属性到最新的输入值,确保光标位置对应于新的字符串开头。 ```javascript <template> <a-input v-model="currentValue" @input="handleInputChange"></a-input> </template> <script> export default { data() { return { currentValue: '', }; }, methods: { handleInputChange(e) { this.currentValue = e.target.value; } }, }; </script> ``` 2. **使用`ref`包装控制聚焦状态**: - 首先给`a-input`创建一个`ref`, - 然后在处理聚焦和输入时,确保光标位于正确的位置。 ```vue <template> <div ref="inputRef"> <a-input v-model="currentValue" /> </div> </template> <script> export default { data() { return { currentValue: '', }; }, mounted() { this.$refs.inputRef.focus(); }, methods: { handleInputChange(e) { const inputEl = this.$refs.inputRef.querySelector('input'); if (inputEl.selectionStart === 0 && inputEl.selectionEnd === 0) { // 如果光标在开头,直接更新value this.currentValue = e.target.value; } else { // 否则,手动设置值聚焦到开始位置 inputEl.value = e.target.value; inputEl.setSelectionRange(0, 0); } }, }, }; </script> ``` 以上代码示例假设你需要在每次输入后都立即定位光标到输入框的起始位置。如果只是偶然出现此问题,确保检查是否有其他代码影响了输入框的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值