Установите фокус мыши и переместите курсор в конец ввода с помощью jQuery

96

Этот вопрос был задан в нескольких разных форматах, но я не могу получить ни одного ответа, который работал бы в моем сценарии.

Я использую jQuery для реализации истории команд, когда пользователь нажимает стрелки вверх / вниз. Когда нажимается стрелка вверх, я заменяю входное значение предыдущей командой и устанавливаю фокус на поле ввода, но хочу, чтобы курсор всегда располагался в конце входной строки.

Мой код, как есть:

$(document).keydown(function(e) {
  var key   = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
  var input = self.shell.find('input.current:last');

  switch(key) {
    case 38: // up
      lastQuery = self.queries[self.historyCounter-1];
      self.historyCounter--;
      input.val(lastQuery).focus();
// and it continues on from there

Как я могу заставить курсор помещаться в конец ввода после фокуса?

Джеродсанто
источник

Ответы:

145

Похоже, очистка значения после фокусировки, а затем сброс работает.

input.focus();
var tmpStr = input.val();
input.val('');
input.val(tmpStr);
скорпион9
источник
4
Это единственное решение, которое мне удалось найти, которое работает в разных браузерах. Престижность вам!
Meshaal
2
Это отлично работает с FF и хромом, но не в IE .. кто-нибудь знает, как решить эту проблему в IE?
Джон Смит
1
Обратите внимание, что вы можете var temp = input.focus().val(); input.val('').val(temp);
объединить
20
Это может быть еще проще:input.focus().val(input.val());
Фатех Хальса
2
Похоже, что contenteditableпо какой-то причине не работает с элементами, может потому, что нужно использовать, .html()а не.val()
jg2703
55

Это выглядит немного странно, даже глупо, но у меня это работает:

input.val(lastQuery);
input.focus().val(input.val());

Я не уверен, что воспроизвел вашу установку. Я предполагаю, inputчто это <input>элемент.

Изменив значение (на себя), я думаю, что курсор помещается в конец ввода. Протестировано в Firefox 3 и MSIE7.

Artlung
источник
1
Да, input - это элемент <input>. Я пробовал это, и это не сработало в FF3 или Safari 4
jerodsanto
Есть новости по этому поводу? Работал у меня. Обновите вопрос или добавьте ответ, если нашли решение.
artlung
В FF15 это устанавливает курсор в начало поля ввода. В остальном он работает нормально. У вас есть решение для FF?
JochenJung
@JochenJung Я не смотрел на это с 2009 года - тогда он работал с FF3 и jQuery. Если вы придумали решение с использованием текущих jQuery и FF15, пожалуйста, не стесняйтесь редактировать этот пост.
artlung
47

Надеюсь, это поможет вам:

var fieldInput = $('#fieldName');
var fldLength= fieldInput.val().length;
fieldInput.focus();
fieldInput[0].setSelectionRange(fldLength, fldLength);
harsh4u
источник
4
Работает нормально, я думаю, что это лучшее решение, чем сброс значения, особенно когда есть какая-то привязка модели к представлению.
morten.c 05
2
Это правильный ответ, устанавливая именно то, что вы хотите установить, не забывая об этом.
Дэн Бэррон
14

У Криса Койера для этого есть мини-плагин jQuery, который отлично работает: http://css-tricks.com/snippets/jquery/move-cursor-to-end-of-textarea-or-input/

Если поддерживается, он использует setSelectionRange , иначе имеет надежный запасной вариант.

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;
  });
};

Тогда вы можете просто сделать:

input.putCursorAtEnd();
jackocnr
источник
Прекрасное спасибо, единственное решение, которое я нашел в 2020 году, похоже, работает надежно.
AdamJones
12

А как насчет одной строчки ...

$('#txtSample').focus().val($('#txtSample').val());

Эта линия у меня работает.

Крис Розете
источник
Спасибо Mad за комментарий
Chris Rosete
8

2 ответ artlung : он работает со второй строкой только в моем коде (IE7, IE8; Jquery v1.6):

var input = $('#some_elem');
input.focus().val(input.val());

Дополнение: если элемент ввода был добавлен в DOM с помощью JQuery, в IE фокус не устанавливается. Я использовал небольшой трюк:

input.blur().focus().val(input.val());
Серго
источник
1
У меня это сработало, но мне пришлось сделать что-то вроде: var input = $ ("# inputID"); tmp = input.val (); input.focus (). val (""). blur (). focus (). val (tmp);
will824
@ will824 ваше решение для комментариев сработало для меня. Отправляю как ответ.
Aamir Shahzad
8

Ссылка: @ will824 Комментарий, это решение сработало для меня без проблем с совместимостью. Остальные решения не удались в IE9.

var input = $("#inputID");
var tmp = input.val();
input.focus().val("").blur().focus().val(tmp);

Протестировано и работает:

Firefox 33
Chrome 34
Safari 5.1.7
IE 9
Аамир Шахзад
источник
6

Я знаю, что этот ответ приходит поздно, но я вижу, что люди не нашли ответа. Чтобы клавиша вверх не помещала курсор в начало, просто return falseиз метода, обрабатывающего событие. Это останавливает цепочку событий, которая приводит к перемещению курсора. Вставка исправленного кода из OP ниже:

$(document).keydown(function(e) {
  var key   = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
  var input = self.shell.find('input.current:last');

  switch(key) {
    case 38: // up
      lastQuery = self.queries[self.historyCounter-1];
      self.historyCounter--;
      input.val(lastQuery).focus();
      // HERE IS THE FIX:
      return false; 
// and it continues on from there
PederOverland
источник
1
Вы можете сократить вторую строку доvar key = e.charCode || e.keyCode || 0;
Gone Coding
6

Я использую код ниже, и он отлично работает

function to_end(el) {
            var len = el.value.length || 0;
            if (len) {
                if ('setSelectionRange' in el) el.setSelectionRange(len, len);
                else if ('createTextRange' in el) {// for IE
                    var range = el.createTextRange();
                    range.moveStart('character', len);
                    range.select();
                }
            }
        }
Томас
источник
6

Для разных браузеров он будет разным:

Это работает в ff:

    var t =$("#INPUT");
    var l=$("#INPUT").val().length;
    $(t).focus();

    var r = $("#INPUT").get(0).createTextRange();
    r.moveStart("character", l); 
    r.moveEnd("character", l);      
    r.select();

Более подробная информация представлена ​​в этих статьях на сайте SitePoint , AspAlliance .

TheVillageIdiot
источник
4

как и другие сказали, у меня сработали очистка и заливка:

    var elem = $('#input_field');
    var val = elem.val();
    elem.focus().val('').val(val);
Фабрицио
источник
3

сначала установите значение. затем установите фокус. когда он фокусируется, он будет использовать значение, которое существует во время фокусировки, поэтому ваше значение должно быть установлено первым.

эта логика работает для меня с приложением, которое заполняет <input>значение clicked <button>. val()устанавливается первым. затемfocus()

$('button').on('click','',function(){
    var value = $(this).attr('value');
    $('input[name=item1]').val(value);
    $('input[name=item1]').focus();
});
гориллагот
источник
Вы можете упростить одну строчку вместо двух:$('input[name=item1]').val(value).focus();
inMILD 08
2

Я обнаружил то же самое, что предлагали несколько человек выше. Если вы focus()сначала нажмете val()на вход, курсор переместится в конец входного значения в Firefox, Chrome и IE. Если вы val()сначала нажмете в поле ввода, Firefox и Chrome поместят курсор в конец, но IE поместит его вперед, когда вы focus().

$('element_identifier').focus().val('some_value') 

должно сработать (по крайней мере, для меня это всегда так).

Трэвис Битти
источник
2

Сначала вы должны установить фокус на выбранном объекте текстового поля, а затем установить значение.

$('#inputID').focus();
$('#inputID').val('someValue')
хладас
источник
1
Я пробовал это, но не работает. Это также работает для вас, если для редактируемого содержимого div установлено значение true?
Рупам Датта,
1
    function focusCampo(id){
        var inputField = document.getElementById(id);
        if (inputField != null && inputField.value.length != 0){
            if (inputField.createTextRange){
                var FieldRange = inputField.createTextRange();
                FieldRange.moveStart('character',inputField.value.length);
                FieldRange.collapse();
                FieldRange.select();
            }else if (inputField.selectionStart || inputField.selectionStart == '0') {
                var elemLen = inputField.value.length;
                inputField.selectionStart = elemLen;
                inputField.selectionEnd = elemLen;
                inputField.focus();
            }
        }else{
            inputField.focus();
        }
    }

$('#urlCompany').focus(focusCampo('urlCompany'));

работает для всех браузеров, т.е.

мадху
источник
1

Вот еще один, один лайнер, который не переназначает значение:

$("#inp").focus()[0].setSelectionRange(99999, 99999);
Чонг Губ Панг
источник
0
function CurFocus()
{
    $('.txtEmail').focus(); 
}

function pageLoad()
{
   setTimeout(CurFocus(),3000);
}

window.onload = pageLoad;
Abbijohn
источник
0

Ответ от scorpion9 работает. Чтобы было понятнее, посмотрите мой код ниже,

<script src="~/js/jquery.js"></script> 
<script type="text/javascript">
    $(function () {
        var input = $("#SomeId");
        input.focus();
        var tmpStr = input.val();
        input.val('');
        input.val(tmpStr);
    });
</script>
Диганта Кумар
источник
-3

Он будет фокусироваться с помощью мыши

$ ("# TextBox"). Focus ();

Пергин Шени
источник