在 html 文本框中设置键盘插入符号位置

2022-08-30 01:06:40

有没有人知道如何将文本框中的键盘插入符号移动到特定位置?

例如,如果文本框(例如输入元素,而不是文本区域)中有50个字符,并且我想将插入符号放在字符20之前,我该怎么做?

这与这个问题不同:jQuery在文本区域中设置光标位置,这需要jQuery。


答案 1

摘自Josh Stodola的设置键盘插入符号位置在文本框或文本区域中使用Javascript

一个泛型函数,允许您将插入符号到您想要的文本框或文本区域的任何位置:

function setCaretPosition(elemId, caretPos) {
    var elem = document.getElementById(elemId);

    if(elem != null) {
        if(elem.createTextRange) {
            var range = elem.createTextRange();
            range.move('character', caretPos);
            range.select();
        }
        else {
            if(elem.selectionStart) {
                elem.focus();
                elem.setSelectionRange(caretPos, caretPos);
            }
            else
                elem.focus();
        }
    }
}

第一个预期参数是要在其上插入键盘插入符号的元素的 ID。如果找不到该元素,则不会发生任何事情(显然)。第二个参数是插入记号位置指数。零会把键盘插入符号放在开头。如果在元素值中传递一个大于字符数的数字,则会将键盘插入符号放在末尾。

在IE6及更高版本,Firefox 2,Opera 8,Netscape 9,SeaMonkey和Safari上进行了测试。不幸的是,在Safari上,它不能与对焦事件结合使用)。

使用上述函数强制键盘插入符号在收到焦点时跳转到页面上所有文本区域末尾的示例:

function addLoadEvent(func) {
    if(typeof window.onload != 'function') {
        window.onload = func;
    }
    else {
        if(func) {
            var oldLoad = window.onload;

            window.onload = function() {
                if(oldLoad)
                        oldLoad();

                func();
            }
        }
    }
}

// The setCaretPosition function belongs right here!

function setTextAreasOnFocus() {
/***
 * This function will force the keyboard caret to be positioned
 * at the end of all textareas when they receive focus.
 */
    var textAreas = document.getElementsByTagName('textarea');

    for(var i = 0; i < textAreas.length; i++) {
        textAreas[i].onfocus = function() {
            setCaretPosition(this.id, this.value.length);
        }
    }

    textAreas = null;
}

addLoadEvent(setTextAreasOnFocus);

答案 2

答案中的链接已断开,这个应该有效(所有学分都转到 blog.vishalon.net):

http://snipplr.com/view/5144/getset-cursor-in-html-textarea/

如果代码再次丢失,以下是两个主要函数:

function doGetCaretPosition(ctrl)
{
 var CaretPos = 0;

 if (ctrl.selectionStart || ctrl.selectionStart == 0)
 {// Standard.
  CaretPos = ctrl.selectionStart;
 }
 else if (document.selection)
 {// Legacy IE
  ctrl.focus ();
  var Sel = document.selection.createRange ();
  Sel.moveStart ('character', -ctrl.value.length);
  CaretPos = Sel.text.length;
 }

 return (CaretPos);
}


function setCaretPosition(ctrl,pos)
{
 if (ctrl.setSelectionRange)
 {
  ctrl.focus();
  ctrl.setSelectionRange(pos,pos);
 }
 else if (ctrl.createTextRange)
 {
  var range = ctrl.createTextRange();
  range.collapse(true);
  range.moveEnd('character', pos);
  range.moveStart('character', pos);
  range.select();
 }
}