请马上登录,朋友们都在花潮里等着你哦:)
您需要 登录 才可以下载或查看,没有账号?立即注册
x
作为轻量级的多行文本编辑控件,textarea 非常经济实惠,但它原生的属性不多,智能自动缩进需要通过编程实现。本文,提供一个自研的自动缩进功能,即,按下回车键后,根据上一行是否有缩进、缩进多少个 tab 和空格来实现下一行也拥有相同的缩进形式。
思路是,监测文本框的 keyup(键位弹起)事件,如果 keyCode === 13,可判断操作的键位是回车键,则运行预设的处理缩进函数。
代码如下:
<style>
#txtbox {
margin: 50px auto;
width: 600px;
height: 400px;
display: block;
padding: 10px;
}
</style>
<textarea id="txtbox"></textarea>
<script>
//智能缩进函数 参数 ele 文本框元素
let insetIndent = (ele) => {
//获取 start - 选择区起始值 end - 选择区结束值 selected - 被选择的字符串
//注:没有被选择文本时就是光标所在的pos值,此时 start = end
let start = ele.selectionStart, end = ele.selectionEnd, selected = ele.value.substring(start,end);
//获取 str1 - 选择区上半部分文本 str2 - 选择区下半部分文本
let str1 = ele.value.substring(0, start), str2 = ele.value.substring(end);
//将上半部分按行拆分为 strAr 数组
let strAr = str1.split('\n');
//获得目标行 :回车按下后倒数第二行
let targetLine = strAr[strAr.length - 2];
//通过匹配行首空格(tab也被视为空格)获取待处理缩进字符数组
let tmpAr = targetLine.match(/^[\s]+/g);
//声明缩进字符变量
let indent = '';
//若缩进字符数组不为空 :将缩进字符加入到 indent 变量
if (tmpAr !== null) indent += tmpAr[0];
//重组文本框文本
ele.value = str1 + indent + str2;
//设置光标位置
ele.setSelectionRange(start + indent.length, start + indent.length);
}
//键盘键位弹起事件
txtbox.onkeyup = (e) => {
//如果键位 keyCode 值等于 13 表明按下的是回车键,运行智能缩进函数
if(e.keyCode === 13) insetIndent(txtbox,e);
}
</script>
效果看楼下,欢迎测试。 |