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

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

这是在区别于这个问题:jQuery设置光标位置在文本区域,这需要jQuery。


当前回答

因为我确实需要这个解决方案,而典型的基线解决方案(聚焦输入-然后设置值等于本身)不能跨浏览器工作,所以我花了一些时间调整和编辑所有内容以使其工作。在@kd7的代码的基础上,这里是我想出的。

享受吧!适用于IE6+, Firefox, Chrome, Safari, Opera

跨浏览器插入符号定位技术(例如:将光标移动到END)

// ** USEAGE ** (returns a boolean true/false if it worked or not)
// Parameters ( Id_of_element, caretPosition_you_want)

setCaretPosition('IDHERE', 10); // example

肉和土豆基本上是@kd7的setCaretPosition,最大的调整是if (el。selectionStart || el。selectionStart === 0),在firefox中selectionStart是从0开始的,在布尔中当然是变为False,所以它在这里中断了。

在chrome最大的问题是,只是给它.focus()是不够的(它一直选择所有的文本!)因此,我们将自身的值设为el。Value = el.value;在调用我们的函数之前,现在它有一个抓取&位置的输入使用selectionStart。

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

    el.value = el.value;
    // ^ this is used to not only get "focus", but
    // to make sure we don't have it everything -selected-
    // (it causes an issue in chrome, and having it doesn't hurt any other browser)

    if (el !== null) {

        if (el.createTextRange) {
            var range = el.createTextRange();
            range.move('character', caretPos);
            range.select();
            return true;
        }

        else {
            // (el.selectionStart === 0 added for Firefox bug)
            if (el.selectionStart || el.selectionStart === 0) {
                el.focus();
                el.setSelectionRange(caretPos, caretPos);
                return true;
            }

            else  { // fail city, fortunately this never happens (as far as I've tested) :)
                el.focus();
                return false;
            }
        }
    }
}

其他回答

function SetCaretEnd(tID) {
    tID += "";
    if (!tID.startsWith("#")) { tID = "#" + tID; }
    $(tID).focus();
    var t = $(tID).val();
    if (t.length == 0) { return; }
    $(tID).val("");
    $(tID).val(t);
    $(tID).scrollTop($(tID)[0].scrollHeight); }

因为我确实需要这个解决方案,而典型的基线解决方案(聚焦输入-然后设置值等于本身)不能跨浏览器工作,所以我花了一些时间调整和编辑所有内容以使其工作。在@kd7的代码的基础上,这里是我想出的。

享受吧!适用于IE6+, Firefox, Chrome, Safari, Opera

跨浏览器插入符号定位技术(例如:将光标移动到END)

// ** USEAGE ** (returns a boolean true/false if it worked or not)
// Parameters ( Id_of_element, caretPosition_you_want)

setCaretPosition('IDHERE', 10); // example

肉和土豆基本上是@kd7的setCaretPosition,最大的调整是if (el。selectionStart || el。selectionStart === 0),在firefox中selectionStart是从0开始的,在布尔中当然是变为False,所以它在这里中断了。

在chrome最大的问题是,只是给它.focus()是不够的(它一直选择所有的文本!)因此,我们将自身的值设为el。Value = el.value;在调用我们的函数之前,现在它有一个抓取&位置的输入使用selectionStart。

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

    el.value = el.value;
    // ^ this is used to not only get "focus", but
    // to make sure we don't have it everything -selected-
    // (it causes an issue in chrome, and having it doesn't hurt any other browser)

    if (el !== null) {

        if (el.createTextRange) {
            var range = el.createTextRange();
            range.move('character', caretPos);
            range.select();
            return true;
        }

        else {
            // (el.selectionStart === 0 added for Firefox bug)
            if (el.selectionStart || el.selectionStart === 0) {
                el.focus();
                el.setSelectionRange(caretPos, caretPos);
                return true;
            }

            else  { // fail city, fortunately this never happens (as far as I've tested) :)
                el.focus();
                return false;
            }
        }
    }
}

我将修复如下条件:

function setCaretPosition(elemId, caretPos)
{
 var elem = document.getElementById(elemId);
 if (elem)
 {
  if (typeof elem.createTextRange != 'undefined')
  {
   var range = elem.createTextRange();
   range.move('character', caretPos);
   range.select();
  }
  else
  {
   if (typeof elem.selectionStart != 'undefined')
    elem.selectionStart = caretPos;
   elem.focus();
  }
 }
}

HTMLInputElement。临时人选;

// References
var e = document.getElementById( "helloworldinput" );

// Move caret to beginning on focus
e.addEventListener( "focus", function( event )
{
    // References
    var e = event.target;

    // Action
    e.setSelectionRange( 0, 0 );            // Doesn’t work for focus event
    
    window.setTimeout( function()
    {
        e.setSelectionRange( 0, 0 );        // Works
        //e.setSelectionRange( 1, 1 );      // Move caret to second position
        //e.setSelectionRange( 1, 2 );      // Select second character

    }, 0 );

}, false );

浏览器兼容性(仅适用于文本、搜索、url、电话和密码类型): https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange#Specifications

<!DOCTYPE html>
<html>
<head>
<title>set caret position</title>
<script type="application/javascript">
//<![CDATA[
window.onload = function ()
{
 setCaret(document.getElementById('input1'), 13, 13)
}

function setCaret(el, st, end)
{
 if (el.setSelectionRange)
 {
  el.focus();
  el.setSelectionRange(st, end);
 }
 else
 {
  if (el.createTextRange)
  {
   range = el.createTextRange();
   range.collapse(true);
   range.moveEnd('character', end);
   range.moveStart('character', st);
   range.select();
  }
 }
}
//]]>
</script>
</head>
<body>

<textarea id="input1" name="input1" rows="10" cols="30">Happy kittens dancing</textarea>

<p>&nbsp;</p>

</body>
</html>