简体   繁体   English

在文本区域中设置文本光标位置

[英]Set text-cursor position in a textarea

I'm working on a BBCode editor and here is the code:我正在使用 BBCode 编辑器,代码如下:

var txtarea = document.getElementById("editor_area");

function boldText() {
    var start = txtarea.selectionStart;
    var end = txtarea.selectionEnd;
    var sel = txtarea.value.substring(start, end);
    var finText = txtarea.value.substring(0, start) + '[b]' + sel + '[/b]' + txtarea.value.substring(end);
    txtarea.value = finText;
    txtarea.focus();
}

Everything is OK except one thing which is the position of the text-cursor.一切正常,除了文本光标的位置。 When I click on the boldText button, it sets the cursor position at the end of the Textarea!!当我单击 boldText 按钮时,它会将光标位置设置在文本区域的末尾!!

Actually, I want to be able to set the cursor position at a certain index.实际上,我希望能够将光标位置设置在某个索引处。 I want something like this:我想要这样的东西:

txtarea.setFocusAt(20);

After refocusing the textarea with txtarea.focus() , add this line:使用txtarea.focus()重新聚焦文本区域后,添加以下行:

txtarea.selectionEnd= end + 7;

That will set the cursor seven positions ahead of where it was previously, which will take [b][/b] into account.这会将光标设置在它之前所在位置的七个位置之前,这将考虑[b][/b]

Example例子

 document.getElementById('bold').addEventListener('click', boldText); function boldText() { var txtarea = document.getElementById("editor_area"); var start = txtarea.selectionStart; var end = txtarea.selectionEnd; var sel = txtarea.value.substring(start, end); var finText = txtarea.value.substring(0, start) + '[b]' + sel + '[/b]' + txtarea.value.substring(end); txtarea.value = finText; txtarea.focus(); txtarea.selectionEnd= end + 7; }
 #editor_area { width: 100%; height: 10em; }
 <button id="bold">B</button> <textarea id="editor_area"></textarea>

if you are using jquery you can do it like this.如果你使用的是 jquery,你可以这样做。

$('textarea').prop('selectionEnd', 13);

you can use these 2 functions below written by Jamie Munro ( setSelectionRange() & setCaretToPos() ):您可以使用下面由Jamie Munro编写的这两个函数( setSelectionRange()setCaretToPos() ):

function setSelectionRange(input, selectionStart, selectionEnd) {
    if (input.setSelectionRange) {
        input.focus();
        input.setSelectionRange(selectionStart, selectionEnd);
    }
    else if (input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', selectionEnd);
        range.moveStart('character', selectionStart);
        range.select();
    }
}

function setCaretToPos (input, pos) {
       setSelectionRange(input, pos, pos);
}

EXAMPLE:例子:

for example, if you want to set the caret at the end of your textarea you can have this: setCaretToPos(document.getElementById('textarea'), -1);例如,如果你想在文本区域的末尾设置插入符号,你可以这样设置: setCaretToPos(document.getElementById('textarea'), -1);

Realizing this is an older question, this is offered only as something to think about as an option now because it may likely be more efficient than extracting and assembling pieces of the textarea value string, and it sets the cursor automatically based on the fourth argument of setRangeText and autofocuses also.意识到这是一个较老的问题,现在仅将其作为一个选项提供,因为它可能比提取和组装文本区域值字符串的片段更有效,并且它会根据第四个参数自动设置光标setRangeText和自动对焦也。 It works in Firefox 66.0.02 and I haven't tested it elsewhere.它适用于 Firefox 66.0.02,我还没有在其他地方测试过。 The cursor is placed after the '[/b]'.光标位于“[/b]”之后。

 t = document.getElementById("editor_area");
 b = t.selectionStart,
 e = t.selectionEnd + 3; // length of '[b]'

 t.setSelectionRange( b, b );
 t.setRangeText( '[b]' );
 t.setSelectionRange( e, e );
 t.setRangeText( '[/b]', e, e, 'end' );

Through JQuery:通过 JQuery:

    var cursorPos = $('#textarea').prop('selectionStart');
    $('#textarea').prop('selectionEnd',cursorPos-2);

This is a little OT, but if anyone is interested:这有点 OT,但如果有人感兴趣:

  • Brief : Set cursor inside input element throug row and column简介:通过行和列将光标设置在输入元素内
  • Dependency : setSelectionRange() from @ashkan nasirzadeh依赖项:来自@ashkan nasirzadeh 的setSelectionRange()
  • Example call: setTextCursor(textarea,textarea.val, 0, 1);示例调用: setTextCursor(textarea,textarea.val, 0, 1);

     // @brief: set cursor inside _input_ at position (column,row) // @input: input DOM element. Eg a textarea // @content: textual content inside the DOM element // @param row: starts a 0 // @param column: starts at 0 function setTextCursor(input, content, row, column){ // search row times: var pos = 0; var prevPos = 0; for( var i = 0; (i<row) && (pos;= -1); ++i){ prevPos = pos. pos = content,indexOf("\n";pos+1), } // if we can't go as much down as we want; // go as far as worked if(-1 == pos){ pos = prevPos; } if(0.= row) ++pos, // one for the linebreak // prevent cursor from going beyond the current line var lineEndPos = content;indexOf("\n"; pos+1), if((-1,= lineEndPos) && (column > lineEndPos-pos)){ // go *only* to the end of the current line pos = lineEndPos; } else{ // act as usual pos += column } setSelectionRange(input, pos,pos); }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM