使用 JavaScript 将光标置于文本输入元素中的文本末尾

IT技术 javascript
2021-01-13 16:43:17

通过 JavaScript 将光标置于输入文本元素中的文本末尾的最佳方法(我认为是最简单的方法)是什么 - 在焦点设置到元素之后?

6个回答

有一种简单的方法可以让它在大多数浏览器中工作

this.selectionStart = this.selectionEnd = this.value.length;

但是,由于一些浏览器的 * 怪癖,更具包容性的答案看起来更像这样

setTimeout(function(){ that.selectionStart = that.selectionEnd = 10000; }, 0);

使用 jQuery (设置侦听器,否则没有必要)

使用 Vanilla JS addEvent这个答案中借用功能


怪癖

Chrome 有一个奇怪的怪癖,即在光标移入该字段之前触发焦点事件;这搞砸了我的简单解决方案。解决此问题的两个选项:

  1. 您可以添加 0 毫秒的超时(将操作推迟到堆栈清除
  2. 您可以将事件从 更改focusmouseup除非您仍然保持关注焦点,否则这对用户来说会很烦人。我并不是很喜欢这两种选择中的任何一种。

此外,@vladkras 指出,某些旧版本的 Opera 会在有空格时错误地计算长度。为此,您可以使用一个比字符串大的数字。

据报道,Opera 有时工作不正确,selectionStartlength在空格上返回较小的数字。这就是为什么我使用10000或任何其他足够大的数字而不是this.value.length(在 IE8 和 IE11 上测试)
2021-03-19 16:43:17
这是一个很好的解决方案,而不是观察(kludge),代码更少,并且比此处讨论的替代方案更易于理解。谢谢。
2021-03-28 16:43:17
this.selectionStart = this.selectionEnd = 0; 这应该将焦点移动到输入框的第一个字母之前。但是,当我调试时,它甚至没有改变 selectionEnd 和 selectionStart 的值!而且也没有把它移到第一个字符!
2021-03-29 16:43:17
我宁愿只为第一个焦点事件这样做,并立即调用它。否则,每次单击该字段时,光标都会移动到末尾。
2021-04-04 16:43:17
在 Chrome 24.0.1312.57、IE 9.0.8112 和 Firefox 18.0.2 中为我工作
2021-04-08 16:43:17

我在 IE 中遇到了同样的问题(在通过 RJS/原型设置焦点之后)。当该字段已经有一个值时,Firefox 已经在最后离开了光标。IE 强制光标到文本的开头。

我得到的解决方案如下:

<input id="search" type="text" value="mycurrtext" size="30" 
       onfocus="this.value = this.value;" name="search"/>

这适用于 IE7 和 FF3

textarea 将是什么?
2021-03-15 16:43:17
现在适用于 Chrome (9.0.597.98)
2021-03-21 16:43:17
这现在在 IE9 中不起作用- 光标跳转到字段的开头。
2021-03-27 16:43:17
在 Chrome 24.0.1312.57、IE 9.0.8112 中为我工作,但不适用于 Firefox 18.0.2
2021-03-31 16:43:17
在 FF 8 中也不起作用。不过来自 chenosaurus 的解决方案似乎有效。
2021-04-05 16:43:17

试试这个,它对我有用:

//input is the input element

input.focus(); //sets focus to element
var val = this.input.value; //store the value of the element
this.input.value = ''; //clear the value of the element
this.input.value = val; //set that value back.  

要使光标移动到末尾,输入必须先有焦点,然后当值改变时它会移动到末尾。如果您将 .value 设置为相同,则它不会在 chrome 中发生变化。

为什么将this.第 2、3、4 行的输入放在前面?我们已经知道那input是输入元素。使用this似乎是多余的。否则很好的解决方案!
2021-03-14 16:43:17
在设置值之前设置焦点是让它在 Chrome 中工作的关键。
2021-03-29 16:43:17
更轻松: $input.focus().val($input.val());
2021-03-29 16:43:17
@Tareq 他们不一样。这个技巧比公认的答案要好得多。
2021-04-03 16:43:17
这就像 onfocus="this.value = this.value;
2021-04-09 16:43:17

稍微研究了一下之后,我发现最好的方法是setSelectionRange在浏览器支持的情况下使用该功能;如果没有,请恢复使用 Mike Barrow 的答案中的方法(即用自身替换该值)。

我也设置scrollTop为高值的情况下,我们正处在一个垂直滚动textarea(使用任意高值似乎比$(this).height()在 Firefox 和 Chrome 中更可靠。)

我已经把它作为一个 jQuery 插件。(如果你不使用 jQuery,我相信你仍然可以很容易地获得要点。)

我已经在 IE6、IE7、IE8、Firefox 3.5.5、Google Chrome 3.0、Safari 4.0.4、Opera 10.00 中进行了测试。

它作为PutCursorAtEnd 插件jquery.com上可用为方便起见,1.0 版的代码如下:

// jQuery plugin: PutCursorAtEnd 1.0
// http://plugins.jquery.com/project/PutCursorAtEnd
// by teedyay
//
// Puts the cursor at the end of a textbox/ textarea

// codesnippet: 691e18b1-f4f9-41b4-8fe8-bc8ee51b48d4
(function($)
{
    jQuery.fn.putCursorAtEnd = function()
    {
    return this.each(function()
    {
        $(this).focus()

        // If this function exists...
        if (this.setSelectionRange)
        {
        // ... then use it
        // (Doesn't work in IE)

        // Double the length because Opera is inconsistent about whether a carriage return is one character or two. Sigh.
        var len = $(this).val().length * 2;
        this.setSelectionRange(len, len);
        }
        else
        {
        // ... otherwise replace the contents with itself
        // (Doesn't work in Google Chrome)
        $(this).val($(this).val());
        }

        // Scroll to the bottom, in case we're in a tall textarea
        // (Necessary for Firefox and Google Chrome)
        this.scrollTop = 999999;
    });
    };
})(jQuery);
为什么要计算长度?如果你无论如何都要超过它,为什么不只是 this.setSelectionRange(9999,9999) 呢?
2021-04-05 16:43:17
<script type="text/javascript">  
    function SetEnd(txt) {  
      if (txt.createTextRange) {  
       //IE  
       var FieldRange = txt.createTextRange();  
       FieldRange.moveStart('character', txt.value.length);  
       FieldRange.collapse();  
       FieldRange.select();  
       }  
      else {  
       //Firefox and Opera  
       txt.focus();  
       var length = txt.value.length;  
       txt.setSelectionRange(length, length);  
      }  
    }   
</script>  

此功能在 IE9、Firefox 6.x 和 Opera 11.x 中对我有效

这在 IE 8 中有效,而其他一些选项则没有。谢谢你。
2021-03-26 16:43:17
在 FF 46、Chrome 51 和 IE 11 中完美运行。
2021-03-28 16:43:17
出于某种原因,流行的答案对我不起作用。这工作完美。
2021-03-31 16:43:17
很棒的第一个现成的解决方案,它似乎适用于 FF6 和 IE8。
2021-04-04 16:43:17
在 IE9 中对我不起作用。错误 :SCRIPT16389: Unspecified error.
2021-04-07 16:43:17