花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 106|回复: 4

Textarea回车键的处理

[复制链接]
  • TA的每日心情
    奋斗
    2026-7-13 12:18
  • 签到天数: 1868 天

    [LV.Master]伴坛终老

    3272

    主题

    13万

    回帖

    29万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2026-5-26 12:35 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    过去手写的基于 textarea 标签的只能回车键处理极为简洁:
    1. // start 和 end 已事先获取
    2. if (e.key === 'Enter') {
    3.     e.preventDefault();
    4.     const tstr = value.substring(0, end);
    5.     const strAr = tstr.split('\n');
    6.     const target = strAr[strAr.length - 1];
    7.     const indent = '\n' + (target.match(/^\s*/)[0] || '');
    8.     ele.setRangeText(indent);
    9.     ele.selectionStart = end + indent.length;
    10.     ele.selectionEnd = end + indent.length;
    11. }
    复制代码

    但它忽略了一个问题:当辑框里如果有选中文本。

    为了省事,我把上面的代码交给DS,让它帮完善。DS考虑得很周到,它提供的代码可行:
    1. if (e.key === 'Enter') {
    2.     const start = ele.selectionStart;
    3.     const end = ele.selectionEnd;
    4.     const hasSelection = start !== end;
    5.    
    6.     // 如果有选中文本,先删除
    7.     if (hasSelection) {
    8.         ele.setRangeText('', start, end, 'start');
    9.     }
    10.    
    11.     // 获取当前光标位置(删除选中文本后的新位置)
    12.     const currentPos = ele.selectionStart;
    13.     const currentValue = ele.value;
    14.    
    15.     // 获取当前行的缩进
    16.     const textBeforeCursor = currentValue.substring(0, currentPos);
    17.     const lines = textBeforeCursor.split('\n');
    18.     const currentLine = lines[lines.length - 1];
    19.     const indent = '\n' + (currentLine.match(/^\s*/)[0] || '');
    20.    
    21.     // 插入换行和缩进
    22.     ele.setRangeText(indent, currentPos, currentPos, 'end');
    23.    
    24.     // 设置光标到新位置
    25.     const newPos = currentPos + indent.length;
    26.     ele.selectionStart = newPos;
    27.     ele.selectionEnd = newPos;
    28. }
    复制代码
    代码量远远超出我的预期。要保持简洁度,还是用回原来的代码,需要改进一下:

    1. // start 和 end 已事先统一获取
    2. if (e.key === 'Enter') {
    3.     e.preventDefault();
    4.     const tstr = value.substring(0, end);
    5.     const strAr = tstr.split('\n');
    6.     const target = strAr[strAr.length - 1];
    7.     const indent = '\n' + (target.match(/^\s*/)[0] || '');
    8.     ele.setRangeText(indent);
    9.     ele.selectionStart = ele.selectionEnd = end + indent.length - (end - start);
    10. }
    复制代码


    核心在 09 行:编辑框输入光标的位置指定——拿选中文本的光标结束位置 end 减去起始位置 start,这样能够巧妙处理了选中和没有选中文本的状态(不选中时 end - start = 0,选中时重设的光标位置要减去 end - start 的差即回车删掉的选中文本的长度)。

    评分

    参与人数 2威望 +80 金钱 +160 经验 +80 收起 理由
    红影 + 50 + 100 + 50 匠心独运,细节精致入微!
    梦江南 + 30 + 60 + 30 创意十足,赞一个!

    查看全部评分

  • TA的每日心情
    开心
    2026-7-14 08:49
  • 签到天数: 779 天

    [LV.10]以坛为家III

    547

    主题

    3万

    回帖

    8万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪缤纷心情心曲飞扬花好月圆飞龙在天音画大师天籁妙音共看流星风雨同行我心永远喜乐安康花潮贵宾

    发表于 2026-5-26 19:05 | 显示全部楼层
    谢谢黑黑老师辛苦,谢谢分享。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-7-13 12:18
  • 签到天数: 1868 天

    [LV.Master]伴坛终老

    3272

    主题

    13万

    回帖

    29万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2026-5-26 19:35 | 显示全部楼层
    梦江南 发表于 2026-5-26 19:05
    谢谢黑黑老师辛苦,谢谢分享。

    这个没有一定的H5和JS基础,可能会像看天书
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1898

    主题

    33万

    回帖

    40万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2026-5-26 23:27 | 显示全部楼层
    有选中文本时,回车还要能调整光标位置,真够麻烦的。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-7-13 12:18
  • 签到天数: 1868 天

    [LV.Master]伴坛终老

    3272

    主题

    13万

    回帖

    29万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2026-5-26 23:53 | 显示全部楼层
    红影 发表于 2026-5-26 23:27
    有选中文本时,回车还要能调整光标位置,真够麻烦的。

    是的,这类处理非常琐碎,需要一一考虑到
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2026-7-14 11:03 , Processed in 0.072954 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表