|
|
请马上登录,朋友们都在花潮里等着你哦:)
您需要 登录 才可以下载或查看,没有账号?立即注册
x
过去手写的基于 textarea 标签的只能回车键处理极为简洁:
- // start 和 end 已事先获取
- if (e.key === 'Enter') {
- e.preventDefault();
- const tstr = value.substring(0, end);
- const strAr = tstr.split('\n');
- const target = strAr[strAr.length - 1];
- const indent = '\n' + (target.match(/^\s*/)[0] || '');
- ele.setRangeText(indent);
- ele.selectionStart = end + indent.length;
- ele.selectionEnd = end + indent.length;
- }
复制代码
但它忽略了一个问题:当辑框里如果有选中文本。
为了省事,我把上面的代码交给DS,让它帮完善。DS考虑得很周到,它提供的代码可行:
- if (e.key === 'Enter') {
- const start = ele.selectionStart;
- const end = ele.selectionEnd;
- const hasSelection = start !== end;
-
- // 如果有选中文本,先删除
- if (hasSelection) {
- ele.setRangeText('', start, end, 'start');
- }
-
- // 获取当前光标位置(删除选中文本后的新位置)
- const currentPos = ele.selectionStart;
- const currentValue = ele.value;
-
- // 获取当前行的缩进
- const textBeforeCursor = currentValue.substring(0, currentPos);
- const lines = textBeforeCursor.split('\n');
- const currentLine = lines[lines.length - 1];
- const indent = '\n' + (currentLine.match(/^\s*/)[0] || '');
-
- // 插入换行和缩进
- ele.setRangeText(indent, currentPos, currentPos, 'end');
-
- // 设置光标到新位置
- const newPos = currentPos + indent.length;
- ele.selectionStart = newPos;
- ele.selectionEnd = newPos;
- }
复制代码 代码量远远超出我的预期。要保持简洁度,还是用回原来的代码,需要改进一下:
- // start 和 end 已事先统一获取
- if (e.key === 'Enter') {
- e.preventDefault();
- const tstr = value.substring(0, end);
- const strAr = tstr.split('\n');
- const target = strAr[strAr.length - 1];
- const indent = '\n' + (target.match(/^\s*/)[0] || '');
- ele.setRangeText(indent);
- ele.selectionStart = ele.selectionEnd = end + indent.length - (end - start);
- }
复制代码
核心在 09 行:编辑框输入光标的位置指定——拿选中文本的光标结束位置 end 减去起始位置 start,这样能够巧妙处理了选中和没有选中文本的状态(不选中时 end - start = 0,选中时重设的光标位置要减去 end - start 的差即回车删掉的选中文本的长度)。
|
|