You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中实现textarea失焦时光标回到起始位置的问题

React Textarea 失焦时光标回到起始位置的解决方案

你在onBlur回调中直接调用setSelectionRange(0, 0)无效的核心原因是:当blur事件触发时,textarea已经失去焦点,此时对选区的修改操作不会被浏览器执行。

可行解决方案

  • 方案一:利用setTimeout延迟执行选区设置
    将选区设置操作推迟到事件循环的下一轮,此时浏览器已完成失焦的基础处理,但仍允许修改选区状态:

    import { useRef } from "react";
    
    export default function App() {
      const textareaRef = useRef(null);
    
      const handleBlur = () => {
        setTimeout(() => {
          textareaRef.current?.setSelectionRange(0, 0);
        }, 0);
      };
    
      return (
        <div className="App">
          <textarea
            ref={textareaRef}
            onBlur={handleBlur}
            rows={5}
            defaultValue="测试文本,失焦后光标回到开头"
          />
        </div>
      );
    }
    
  • 方案二:临时重新聚焦后设置选区
    如果方案一在部分浏览器不生效,可以先手动让textarea聚焦,设置选区后再主动失焦(注意可能会有短暂的聚焦闪烁):

    const handleBlur = () => {
      const el = textareaRef.current;
      if (!el) return;
      
      el.focus();
      el.setSelectionRange(0, 0);
      el.blur();
    };
    

原理说明

setTimeout(..., 0)会将回调放入宏任务队列,等待当前blur事件的所有同步处理完成后再执行,此时浏览器仍能识别对textarea选区的修改;而临时聚焦的方式则是强制让元素处于可修改选区的状态,完成设置后再恢复失焦状态。

内容的提问来源于stack exchange,提问作者Adam Ridhwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:25:19