input 获取光标位置设置光标位置方案

 更新时间:2023年06月29日 10:09:27   作者:时倾  
这篇文章主要为大家介绍了input 获取光标位置设置光标位置方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

需求

输入框,支持键盘输入与快捷按键 输入,UI 如下「基于antd」:

关键点:键盘输入直接使用 input onChange 事件即可,快捷按键输入需要根据光标位置插入,插入后光标在新插入的字符后。

解决方案

获取 input 光标位置

通过 element.selectionStart 获取光标位置。

const inputDom = document.getElementById("input")
const selectionStart = inputDom.selectionStart

如图,此时的 selectionStart 是 3。

设置 input 光标

通过 element.setSelectionRange() 设置光标位置,前提是 input 被 focus。

inputDom.focus()
// focus() 异步,所以加了 setTimeout
setTimeout(() => {
  const nextSelection = selectionStart + 1
  inputDom.setSelectionRange(nextSelection, nextSelection)
}, 0)

element.setSelectionRange 语法

element.setSelectionRange(selectionStart, selectionEnd [, selectionDirection]);

  • selectionStart: 被选中的第一个字符的位置索引, 从 0 开始。如果这个值比元素的 value 长度还大,则会被看作 value 最后一个位置的索引。
  • selectionEnd: 被选中的最后一个字符的下一个位置索引。如果这个值比元素的 value 长度还大,则会被看作 value 最后一个位置的索引。
  • selectionDirection:选择方向。forward/backward/none

如果 selectionStart 与 selectionEnd 相同,不选中任何,光标聚集在 selectionStart/selectionEnd。

如果 selectionEnd 小于 selectionStart,不选中任何,光标聚集在在 selectionEnd。

inputDom.setSelectionRange(0, 4)表现如下图:

完整代码

import React, { useState, useRef } from 'react'
import { throttle } from 'lodash'
import { Input, Button, Tag } from 'antd'
const SHORTCUT = [0, '*', '#', 9]
const InputPro = () => {
  const [value, setValue] = useState('')
  const inputRef = useRef()
  const handleSubmit = throttle(() => {
    console.log('value', value)
  }, 3000)
  const handleInputChange = e => {
    setValue(e.target.value?.trim())
  }
  const handleTagChange = val => {
    const inputDom = inputRef.current?.input || {}
    let selectionStart = inputDom.selectionStart
    if (typeof selectionStart !== 'number') {
      selectionStart = value.length
    }
    const data = `${value.slice(
      0,
      selectionStart,
    )}${val}${value.slice(selectionStart)}`
    if (data.length <= 25) {
      setValue(data)
      inputDom.focus()
      setTimeout(() => {
        const nextSelection = selectionStart + 1
        inputDom.setSelectionRange(nextSelection, nextSelection)
      }, 0)
    }
  }
  return (
    <div>
      <Input.Group compact>
        <Input
          allowClear
          style={{ width: 160 }}
          maxLength={25}
          placeholder='请输入'
          value={value}
          onChange={handleInputChange}
          ref={inputRef}
        />
        <Button
          type='primary'
          onClick={handleSubmit}
          disabled={value.length === 0}
        >
          确认
        </Button>
      </Input.Group>
      <div style={{ display: 'flex', alignItems: 'center', marginTop: 8 }}>
        {SHORTCUT.map(itm => (
          <div key={itm} onClick={() => handleTagChange(itm)}>
            <Tag color="#108ee9">{itm}</Tag>
          </div>
        ))}
      </div>
    </div>
  )
}
export default InputPro

以上就是input 获取光标位置设置光标位置方案的详细内容,更多关于input 获取设置光标位置的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:

相关文章

  • JS实现水平遍历和嵌套递归操作示例

    JS实现水平遍历和嵌套递归操作示例

    这篇文章主要介绍了JS实现水平遍历和嵌套递归操作,结合实例形式分析了javascript遍历与递归相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • 浅聊一下Javascript中的数据类型和类型转换

    浅聊一下Javascript中的数据类型和类型转换

    在JavaScript中,理解数据类型,如何区分它们,以及它们如何被转换是至关重要的,在这篇文章中,我们将探讨这些主题,以帮助大家巩固JavaScript基础
    2023-08-08
  • 微信小程序canvas分享海报功能

    微信小程序canvas分享海报功能

    这篇文章主要为大家详细介绍了微信小程序canvas分享海报功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • js获取url参数的使用扩展实例

    js获取url参数的使用扩展实例

    js获取参数的具体应用,欢迎加入脚本之家交流群
    2007-12-12
  • JS+HTML+CSS实现轮播效果

    JS+HTML+CSS实现轮播效果

    这篇文章主要为大家详细介绍了JS+HTML+CSS实现轮播效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • js实现点击向下展开的下拉菜单效果代码

    js实现点击向下展开的下拉菜单效果代码

    这篇文章主要介绍了js实现点击向下展开的下拉菜单效果代码,涉及javascript鼠标事件控制页面元素样式变换的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • JS+JQuery实现无缝连接轮播图

    JS+JQuery实现无缝连接轮播图

    这篇文章主要介绍了JS+JQuery实现无缝连接轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • JS循环遍历ul中li的点击事件给选中li添加css样式(示例代码)

    JS循环遍历ul中li的点击事件给选中li添加css样式(示例代码)

    对于一个ul中固定的li个数,当点击其中一个li时,改变选中li的颜色;同时改变对应的另一个ul中li的颜色,怎么实现这个功能呢,下面小编给大家带来了js循环遍历ul中li的点击事件,给给选中li添加css样式,感兴趣的朋友一起看看吧
    2023-07-07
  • 原生JavaScript实现的简单省市县三级联动功能示例

    原生JavaScript实现的简单省市县三级联动功能示例

    这篇文章主要介绍了原生JavaScript实现的简单省市县三级联动功能,结合完整实例形式分析了javascript联动菜单的实现方法,涉及javascript事件响应及页面元素动态操作相关实现技巧,需要的朋友可以参考下
    2017-05-05
  • 用ES6写全屏滚动插件的示例代码

    用ES6写全屏滚动插件的示例代码

    本篇文章主要介绍了用ES6写全屏滚动插件的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论