Используйте JavaScript, чтобы поместить курсор в конец текста в элементе ввода текста - PullRequest
278 голосов
/ 04 февраля 2009

Каков наилучший способ (и я полагаю, самый простой способ) поместить курсор в конец текста во входном текстовом элементе с помощью JavaScript - после того, как фокус был установлен на элемент?

Ответы [ 29 ]

169 голосов
/ 14 мая 2012

Существует простой способ заставить его работать в большинстве браузеров.

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

Однако, из-за * причуд в некоторых браузерах, более инклюзивный ответ выглядит примерно так

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

Использование jQuery (для настройки прослушивателя, но это не обязательно)

$('#el').focus(function(){
  var that = this;
  setTimeout(function(){ that.selectionStart = that.selectionEnd = 10000; }, 0);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id='el' type='text' value='put cursor at end'>

Использование Vanilla JS (заимствование addEvent функция от этот ответ )

// Basic cross browser addEvent
function addEvent(elem, event, fn){
if(elem.addEventListener){
  elem.addEventListener(event, fn, false);
}else{
  elem.attachEvent("on" + event,
  function(){ return(fn.call(elem, window.event)); });
}}
var element = document.getElementById('el');

addEvent(element,'focus',function(){
  var that = this;
  setTimeout(function(){ that.selectionStart = that.selectionEnd = 10000; }, 0);
});
<input id='el' type='text' value='put cursor at end'>

Причуды

Chrome имеет странную причуду, когда событие фокусировки срабатывает до того, как курсор перемещается в поле; что портит мое простое решение. Два варианта исправить это:

  1. Вы можете добавить тайм-аут 0 мс (к отложить операцию до тех пор, пока не очистится стек )
  2. Вы можете изменить событие с focus на mouseup. Это было бы довольно раздражающим для пользователя, если вы все еще не отслеживали фокус. Я не очень люблю ни один из этих вариантов.

Кроме того, @vladkras указал, что некоторые более старые версии Opera неправильно вычисляют длину, когда в ней есть пробелы. Для этого вы можете использовать огромное число, которое должно быть больше вашей строки.

164 голосов
/ 10 апреля 2009

Я столкнулся с той же проблемой (после установки фокуса через RJS / prototype) в IE. Firefox уже оставлял курсор в конце, когда уже есть значение для поля. IE заставлял курсор к началу текста.

Я пришел к следующему решению:

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

Это работает как в IE7, так и в FF3

142 голосов
/ 27 февраля 2010

Попробуйте, у меня это сработало:

//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.

96 голосов
/ 04 ноября 2009

Немного поработав с этим, я обнаружил, что лучше всего использовать функцию setSelectionRange, если браузер ее поддерживает; если нет, вернитесь к использованию метода в ответе Майка Берроу (т.е. замените значение на себя).

Я также устанавливаю 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.

Он доступен на jquery.com как плагин PutCursorAtEnd . Для вашего удобства код выпуска 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);
19 голосов
/ 16 сентября 2011
<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

15 голосов
/ 10 января 2012

Я попробовал следующее с довольно большим успехом в Chrome

$("input.focus").focus(function () {
    var val = this.value,
        $this = $(this);
    $this.val("");

    setTimeout(function () {
        $this.val(val);
    }, 1);
});

Краткое описание:

Он принимает каждое поле ввода с фокусом на нем, затем сохраняет старое значение поля ввода в переменной, после чего применяет пустую строку к полю ввода.

Затем он ждет 1 миллисекунду и снова вводит старое значение.

7 голосов
/ 14 ноября 2015

Simple. При редактировании или изменении значений сначала установите фокус, а затем установите значение.

$("#catg_name").focus();
$("#catg_name").val(catg_name);
6 голосов
/ 15 февраля 2011

Тем не менее, промежуточная переменная необходима, (см. Var val =) иначе курсор ведет себя странно, нам это нужно в конце.

<body onload="document.getElementById('userinput').focus();">
<form>
<input id="userinput" onfocus="var val=this.value; this.value=''; this.value= val;"
         class=large type="text" size="10" maxlength="50" value="beans" name="myinput">
</form>
</body>
5 голосов
/ 13 ноября 2014

Для всех браузеров на все случаи:

function moveCursorToEnd(el) {
    window.setTimeout(function () {
            if (typeof el.selectionStart == "number") {
            el.selectionStart = el.selectionEnd = el.value.length;
        } else if (typeof el.createTextRange != "undefined") {
            var range = el.createTextRange();
            range.collapse(false);
            range.select();
        }
    }, 1);
}

Требуется время ожидания, если вам нужно переместить курсор из обработчика события onFocus

3 голосов
/ 01 марта 2010

В jQuery это

$(document).ready(function () {
  $('input').focus(function () {
    $(this).attr('value',$(this).attr('value'));
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...