花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 19|回复: 5

textarea移动行代码示例

[复制链接]
  • TA的每日心情
    奋斗
    2026-5-27 20:40
  • 签到天数: 1827 天

    [LV.Master]伴坛终老

    3231

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

    发表于 2026-5-27 20:43 | 显示全部楼层 |阅读模式

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

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

    x

    在 textarea 编辑器中上下移动光标所在行或选中的多行,应该有多种实现方式。由于个人偏好使用JS数组,以下实现机制主要通过数组达成,整体思路和实现步骤应该可以在代码注释中得以充分展现:

    <style> #ta { width: 600px; height: 300px; padding: 10px; display: block; margin: 20px auto; } </style> <textarea id="ta"> 眼儿媚 石孝友 愁云淡淡雨潇潇, 暮暮复朝朝。 别来应是, 眉峰翠减, 腕玉香销。 【注】 ①萱草,又名谖草,谖就是忘的意思。《诗经·卫风·伯兮》:“焉得谖草,言树之背”。朱熹注曰:“谖草,令人忘忧。” ②杜甫《佳人》:“天寒翠袖薄,日暮倚修竹。” ③张说《戏草树》:“戏问芭蕉叶,何愁心不开。” </textarea> <div style="text-align: center">(点击任意行或选中多行,然后按 alt+↑/↓ 上下移动行)</div> <script> ta.onkeydown = (e) => moveLines(ta, e); // 编辑器按键按下时运行移动行函数 // 函数 moveLines : 移动textarea中的单行/多行 // textarea - 编辑器DOM实体 // event - 事件对象 // // 函数通过 ALT + ↑/↓ 触发 // function moveLines(textarea, event) { if (!event.altKey) return; // 由Alt键触发 event.preventDefault(); // 组着默认行为 // 光标位置 let start = textarea.selectionStart, end = textarea.selectionEnd; let len = 0, // 字符串累加长度(用于 begins 和 ends) begins = [], // 选中行索引数组(相对于 start) ends = [], // 选中行行索引数组(相对于 end) s1 = [], // 分割数组1(选中行上方行数组) s2 = [], // 分割数组2(选中行数组) s3 = [], // 分割数组3(选中行下方行数组) exchangeline; // 交换行 const ar = textarea.value.split('\n'); // 编辑器内容按行拆分存入数组 // 遍历所有行获取 begins、ends 行号索引值 : // beings[0]是选中行第一行,ends[0]是选中行最后一行 for (let i = 0; i < ar.length; i ++) { len += ar[i].length + 1; // 基于 start 获取 begins 行索引 if (len > start) { begins.push(i); } // 基于 end 获取 ends 行索引 if (len >= end) { ends.push(i); break; } } // 根据 begins[0]、ends[0] 确定选中行上方、选中行、选中行下方行数组 s1 = ar.filter((item, key) => key < begins[0]); s2 = ar.filter((item, key) => key >= begins[0] && key <= ends[0]); s3 = ar.filter((item, key) => key > ends[0]); // 如果按下的是 Alt+↑ if (event.key === 'ArrowUp') { if (begins[0] === 0) return; // 选中行第一行是编辑器的第一行时退出操作 exchangeline = s1[s1.length - 1]; // 交换行是 s1 的最后一行 s1.pop(); // s1 删除最后一行元素 s3.unshift(exchangeline); // s3 接收交换行到第一行 // 如果按下的是 Alt + ↓ } else if(event.key === 'ArrowDown') { if (ends[0] === ar.length - 1) return; // 选中行最后一行是编辑器最后一行时退出操作 exchangeline = s3[0]; // 交换行是 s3 第一行 s1.push(exchangeline); // s1 接收交换行到最后一行 s3.shift(); // s3 剔除第一行 } textarea.value = [...s1, ...s2, ...s3].join('\n'); // 重新组装编辑器的内容 // 重新确定编辑框选中的文本(选中文本是编辑框第一行时做特殊处理以确保正行文本被选中) textarea.selectionStart = s1.join('\n').length + (s1.length === 0 ? 0 : 1); textarea.selectionEnd = s1.join('\n').length + s2.join('\n').length + 1; } </script>

    核心在 moveLines() 函数中,里面的设计是将编辑器里的内容分成三部分:选中的行、选中行前边的行和后边的行,以数组方式存储并对之进行处理,最后整合为新的编辑器文本 Value 值。本方案去掉注释后代码量已经相当简洁,至少代码量比 AI 推荐的方法少很多。

    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 匠心独运,细节精致入微!

    查看全部评分

  • TA的每日心情
    奋斗
    2026-5-27 20:40
  • 签到天数: 1827 天

    [LV.Master]伴坛终老

    3231

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2026-5-27 20:58 | 显示全部楼层
    一楼移动行的实现方案已经应用到 mhta.js,应用实例:

    http://mhh.52qingyin.cn/api/pencilcode/simple-editor.html
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-5-28 00:05
  • 签到天数: 549 天

    [LV.9]以坛为家II

    370

    主题

    4175

    回帖

    2万

    积分

    版主

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

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2026-5-27 22:01 | 显示全部楼层
    马黑黑 发表于 2026-5-27 20:58
    一楼移动行的实现方案已经应用到 mhta.js,应用实例:

    http://mhh.52qingyin.cn/api/pencilcode/simple- ...

    感谢马老师开发出很实用的功能,辛苦了
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1897

    主题

    33万

    回帖

    39万

    积分

    管理员

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

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

    发表于 2026-5-27 22:20 | 显示全部楼层
    用ALT加上上下键,可以让选中的行整体移动呢。这个太神奇了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-5-27 20:40
  • 签到天数: 1827 天

    [LV.Master]伴坛终老

    3231

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2026-5-27 22:27 | 显示全部楼层
    红影 发表于 2026-5-27 22:20
    用ALT加上上下键,可以让选中的行整体移动呢。这个太神奇了

    绝大多数代码编辑器都支持移动单行/多行功能,各自定义的组合键不一样。Textarea也可以通过JS做到。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-5-27 20:40
  • 签到天数: 1827 天

    [LV.Master]伴坛终老

    3231

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2026-5-27 22:27 | 显示全部楼层
    杨帆 发表于 2026-5-27 22:01
    感谢马老师开发出很实用的功能,辛苦了

    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-5-28 01:57 , Processed in 0.118045 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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