找出“线”;文本区域中光标的(行)编号
我想找出并跟踪文本区域中光标的“行号”(行)。 (“更大的图景”是在每次创建/修改/选择新行时解析该行上的文本,当然,如果文本没有粘贴进去。这可以节省在设定的时间间隔不必要地解析整个文本。)
StackOverflow 上有几篇文章,但没有一个具体回答我的问题,大多数问题都是关于光标位置(以像素为单位)或在文本区域之外显示行号。
我的尝试如下,从第一行开始并且不离开文本区域时效果很好。当单击文本区域并在另一行返回该文本区域时,它会失败。将文本粘贴到其中时也会失败,因为起始行不是 1。
我的 JavaScript 知识非常有限。
<html>
<head>
<title>DEVBug</title>
<script type="text/javascript">
var total_lines = 1; // total lines
var current_line = 1; // current line
var old_line_count;
// main editor function
function code(e) {
// declare some needed vars
var keypress_code = e.keyCode; // key press
var editor = document.getElementById('editor'); // the editor textarea
var source_code = editor.value; // contents of the editor
// work out how many lines we have used in total
var lines = source_code.split("\n");
var total_lines = lines.length;
// do stuff on key presses
if (keypress_code == '13') { // Enter
current_line += 1;
} else if (keypress_code == '8') { // Backspace
if (old_line_count > total_lines) { current_line -= 1; }
} else if (keypress_code == '38') { // Up
if (total_lines > 1 && current_line > 1) { current_line -= 1; }
} else if (keypress_code == '40') { // Down
if (total_lines > 1 && current_line < total_lines) { current_line += 1; }
} else {
//document.getElementById('keycodes').innerHTML += keypress_code;
}
// for some reason chrome doesn't enter a newline char on enter
// you have to press enter and then an additional key for \n to appear
// making the total_lines counter lag.
if (total_lines < current_line) { total_lines += 1 };
// putput the data
document.getElementById('total_lines').innerHTML = "Total lines: " + total_lines;
document.getElementById('current_line').innerHTML = "Current line: " + current_line;
// save the old line count for comparison on next run
old_line_count = total_lines;
}
</script>
</head>
<body>
<textarea id="editor" rows="30" cols="100" value="" onkeydown="code(event)"></textarea>
<div id="total_lines"></div>
<div id="current_line"></div>
</body>
</html>
I would like to find out and keep track of the 'line number' (rows) of the cursor in a textarea. (The 'bigger picture' is to parse the text on the line every time a new line is created/modified/selected, if of course the text was not pasted in. This saves parsing the whole text un-necessarily at set intervals.)
There are a couple of posts on StackOverflow however none of them specifically answer my question, most questions are for cursor position in pixels or displaying lines numbers besides the textarea.
My attempt is below, it works fine when starting at line 1 and not leaving the textarea. It fails when clicking out of the textarea and back onto it on a different line. It also fails when pasting text into it because the starting line is not 1.
My JavaScript knowledge is pretty limited.
<html>
<head>
<title>DEVBug</title>
<script type="text/javascript">
var total_lines = 1; // total lines
var current_line = 1; // current line
var old_line_count;
// main editor function
function code(e) {
// declare some needed vars
var keypress_code = e.keyCode; // key press
var editor = document.getElementById('editor'); // the editor textarea
var source_code = editor.value; // contents of the editor
// work out how many lines we have used in total
var lines = source_code.split("\n");
var total_lines = lines.length;
// do stuff on key presses
if (keypress_code == '13') { // Enter
current_line += 1;
} else if (keypress_code == '8') { // Backspace
if (old_line_count > total_lines) { current_line -= 1; }
} else if (keypress_code == '38') { // Up
if (total_lines > 1 && current_line > 1) { current_line -= 1; }
} else if (keypress_code == '40') { // Down
if (total_lines > 1 && current_line < total_lines) { current_line += 1; }
} else {
//document.getElementById('keycodes').innerHTML += keypress_code;
}
// for some reason chrome doesn't enter a newline char on enter
// you have to press enter and then an additional key for \n to appear
// making the total_lines counter lag.
if (total_lines < current_line) { total_lines += 1 };
// putput the data
document.getElementById('total_lines').innerHTML = "Total lines: " + total_lines;
document.getElementById('current_line').innerHTML = "Current line: " + current_line;
// save the old line count for comparison on next run
old_line_count = total_lines;
}
</script>
</head>
<body>
<textarea id="editor" rows="30" cols="100" value="" onkeydown="code(event)"></textarea>
<div id="total_lines"></div>
<div id="current_line"></div>
</body>
</html>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可能需要使用
selectionStart
来执行此操作:当您使用鼠标更改光标位置时,这也适用。
You would want to use
selectionStart
to do this:This works when you change the cursor position using the mouse as well.
由于自动换行,这很困难。计算存在的换行符数量是一件非常容易的事情,但是当新行是由于自动换行而产生时会发生什么?为了解决这个问题,创建一个镜像很有用(来源:github.com/jevin)。思路是这样的:
在 JSFiddle
This is tough because of word wrap. It's a very easy thing to count the number of line breaks present, but what happens when the new row is because of word wrap? To solve this problem, it's useful to create a mirror (credit: github.com/jevin). Here's the idea:
On JSFiddle
当我发现你可以获得光标的边界矩形时,我解决了这个问题,因此它是相对于父级的 y 坐标
I cracked this when I found out you could get the bounding rect of the cursor, and thus it's y coordinate relative to the parent
这对我有用:
受到 colab 答案的启发作为起点,这包括自动换行的数量,而无需引入镜像(如 Bradbarbin 的答案)。
诀窍只是计算列数
textarea.cols
可以将显式换行符\n
之间的每个段的长度除以多少次。注意:从
1
开始计数。This worked for me:
Inspired by colab's answer as a starting point, this includes the number of word wraps without having to introduce a mirror (as in bradbarbin's answer).
The trick is simply counting how many times the number of columns
textarea.cols
can divide the length of each segment between explicit line breaks\n
.Note: this starts counting at
1
.使用
elem.selectionEnd
我可以获取光标的当前位置(即所选突出显示的末尾),然后使用substr
和split("\n" )
以在您开始使用onkeyup
键入时获取行号。信息显示如下:
这些都指的是光标的当前位置:
我可以通过调用
onclick
来完成此操作该事件的onkeyup()
。您还可以将此代码复制粘贴到地址栏中,并将其保存为书签以供以后使用:
我认为这是一个很好的起点,您想要创建自己的自定义文本编辑器来显示该信息。我以此代码为例制作了一个 小型 HTML 代码编辑器。
Using
elem.selectionEnd
I could get the current position of your cursor (which is the end of your selected highlight) then usedsubstr
andsplit("\n")
to get the line number when you start typing usingonkeyup
.The information is displayed like this:
This all refers to the current position of your cursor:
I was able to do this
onclick
by callingonkeyup()
on that event.You can also copy-paste this code into your address bar and save it as a bookmark to use later:
I think this is a good place to start of you wanted to create your own custom text editor that displays that information. I made a tiny HTML code editor with this code as an example.