# 检测 textarea 元素输入并实时展示行数--源码实践
# 主要需求:
- textarea 文本域输入的行数展示
# 效果
# 实验Gif
内嵌 PlayGround
# 思路:
两个 textarea 文本域
- (行数 textarea)一个为行数显示,设置只有一列,浮动于输入框 textarea 左边
- (输入框 textarea)一个为输入框
- 同步 输入框 textarea 与 行数 textarea 的滚动高度
# 代码
<td width="55%">
<div id="ol">
<textarea cols="1" rows="10" id="index_EL" disabled></textarea>
</div>
<!-- prettier-ignore -->
<textarea
name="co"
cols="60"
rows="10"
wrap="off"
id="input_area_EL"
onkeyup="handleKeyUp('input_area_EL')"
onFocus="handleFocus('input_area_EL')"
onblur="handleBlur('input_area_EL')"
onscroll="G('index_EL').scrollTop = this.scrollTop;"
placeholder="请输入内容"
oncontextmenu="return false"
></textarea>
</td>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 同步两个 textarea 的滚动高度
onscroll = "G('index_EL').scrollTop = this.scrollTop;";
// 附带:G函数,得到当前的ID绑定的元素
function G(objid) {
return document.getElementById(objid);
}
1
2
3
4
5
6
2
3
4
5
6
# 获取输入框内容,计算行数,并设置行数 textarea 的内容
- 注意--textarea 输入框内容的换行判断
windows 平台 `\r\n` 才表示会换行
`\r:`表示回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖(光标在该行的头部)
`\r\n:`表示换行,换到当前位置的下一行(光标在下一行的头部)
1
2
3
4
5
2
3
4
5
function handleKeyUp(_el) {
// \r 回车
// \n 换行
// \t 制表
var obj = G(_el);
var n = 1;
if (obj) {
var str = obj.value;
/**
* windows平台 `\r\n` 才会换行
* \r:表示回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖(光标在该行的头部)
* \r\n:表示换行,换到当前位置的下一行(光标在下一行的头部)
*/
str = str.replace(/\r/gi, "");
str = str.split("\n");
n = str.length;
}
line(n);
}
/**
* 计算行数
*/
function line(n = 1) {
var lineobj = G("index_EL");
for (var i = 1; i <= n; i++) {
if (document.all) {
// 非IE
num += i + "\r\n";
} else {
// 非IE
num += i + "\n";
}
}
lineobj.value = num;
num = "";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40