Use JavaScript para colocar o cursor no final do texto no elemento de entrada de texto

308

Qual é a melhor maneira (e presumo a maneira mais simples) de colocar o cursor no final do texto em um elemento de texto de entrada via JavaScript - após o foco ter sido definido para o elemento?

Amendoim
fonte

Respostas:

170

Eu enfrentei esse mesmo problema (depois de definir o foco através do RJS / protótipo) no IE. O Firefox já estava deixando o cursor no final quando já existe um valor para o campo. O IE estava forçando o cursor para o início do texto.

A solução que cheguei é a seguinte:

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

Isso funciona no IE7 e no FF3

Mike Berrow
fonte
3
O que será para a área de texto?
Tareq
19
Funciona agora no Chrome (9.0.597.98)
Matt
6
Agora isso não funciona no IE9 - o cursor salta para o início do campo.
Cidade
6
Também não funciona no FF 8. A solução do quenossauro parece funcionar.
23611 simon
3
trabalhou para mim no Chrome 24.0.1312.57, IE 9.0.8112, mas não Firefox 18.0.2
Chris - Haddox Technologies
190

Existe uma maneira simples de fazê-lo funcionar na maioria dos navegadores.

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

No entanto, devido às peculiaridades * de alguns navegadores, uma resposta mais abrangente se parece mais com esta

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

Usando jQuery (para definir o ouvinte, mas não é necessário caso contrário)

Usando o Vanilla JS ( addEventfunção de empréstimo desta resposta )


Peculiaridades

O Chrome possui uma peculiaridade ímpar, na qual o evento de foco é acionado antes que o cursor seja movido para o campo; que estraga minha solução simples. Duas opções para corrigir isso:

  1. Você pode adicionar um tempo limite de 0 ms (para adiar a operação até que a pilha esteja limpa )
  2. Você pode alterar o evento de focuspara mouseup. Isso seria muito chato para o usuário, a menos que você ainda acompanhasse o foco. Eu realmente não estou apaixonado por nenhuma dessas opções.

Além disso, @vladkras apontou que algumas versões mais antigas do Opera calculam incorretamente o comprimento quando há espaços. Para isso, você pode usar um número enorme que deve ser maior que sua string.

Gary
fonte
2
trabalhou para mim no Chrome 24.0.1312.57, IE 9.0.8112 e Firefox 18.0.2
Chris - Haddox Technologies
4
Esta é uma boa solução em vez de uma observação (kludge), é menos código e é mais compreensível do que as alternativas discutidas aqui. Obrigado.
Derek Litz 27/03
Prefiro fazer isso apenas no primeiro evento de foco e chamá-lo imediatamente. Caso contrário, sempre que você clicar no campo, o cursor será movido para o final.
11133 Damien
this.selectionStart = this.selectionEnd = 0; isso deve mover o foco antes da primeira letra da caixa de entrada. Mas, quando depurei, nem mudava o valor de selectionEnd e selectionStart! E também não movê-lo para o primeiro personagem !!
soham
1
Foi relatado que o Opera funcionava incorretamente algumas vezes com selectionStarte lengthretornando um número menor nos espaços. É por isso que eu uso 10000ou qualquer outro número grande o suficiente, em vez de this.value.length(testado no IE8 e IE11)
vladkras
160

Tente isso, funcionou para mim:

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

Para que o cursor seja movido para o final, a entrada deve ter o foco primeiro e, quando o valor for alterado, ele será finalizado. Se você definir .value para o mesmo, não será alterado no chrome.

quenossauro
fonte
2
Isto é como onfocus = "this.value = this.value;
Tareq
15
Definir o foco antes de definir o valor é a chave para fazê-lo funcionar no Chrome.
Anatoly techtonik
7
Por que colocar this.na frente da entrada nas linhas 2, 3 e 4? Já sabemos que esse inputé o elemento de entrada. O uso thisparece redundante. Boa solução caso contrário!
1111
3
@Tareq Eles não são os mesmos. Esse truque é muito melhor que a resposta aceita.
Lewis
4
Mais fácil:$input.focus().val($input.val());
milkovsky
99

Depois de mexer um pouco com isso, achei a melhor maneira de usar a setSelectionRangefunção se o navegador suportar; caso contrário, volte a usar o método na resposta de Mike Berrow (ou seja, substitua o valor por ele mesmo).

Também estou definindo scrollTopum valor alto no caso de estarmos em uma rolagem vertical textarea. (Usar um valor alto arbitrário parece mais confiável do que $(this).height()no Firefox e Chrome.)

Eu fiz isso como um plugin jQuery. (Se você não estiver usando o jQuery, confio em que você ainda consiga entender o conteúdo com facilidade).

Eu testei no IE6, IE7, IE8, Firefox 3.5.5, Google Chrome 3.0, Safari 4.0.4, Opera 10.00.

Está disponível no jquery.com como o plug-in PutCursorAtEnd . Para sua conveniência, o código da versão 1.0 é o seguinte:

// 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);
teedyay
fonte
4
Por que calcular o comprimento? Por que não apenas this.setSelectionRange (9999,9999) se você deseja superá-lo de qualquer maneira?
PRMan
21
<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>  

Essa função funciona para mim no IE9, Firefox 6.xe Opera 11.x

Hallgeir Engen
fonte
Ótimo, primeira solução pronta que parece funcionar tanto para o FF6 quanto para o IE8.
simon
3
Por alguma razão, a resposta popular não funcionou para mim. Isso funcionou perfeitamente.
precisa saber é o seguinte
Não funciona para mim no IE9. Erro:SCRIPT16389: Unspecified error.
soham
1
Funciona perfeitamente em FF 46, Chrome 51 e IE 11.
webdevguy
Isso funciona no IE 8, enquanto alguma outra opção não. Obrigado.
BenMaddox 01/08
17

Eu tentei o seguinte com muito sucesso no chrome

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

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

Resumo rápido:

Ele pega todos os campos de entrada com o foco da classe e, em seguida, armazena o valor antigo do campo de entrada em uma variável, depois aplica a string vazia ao campo de entrada.

Então ele espera 1 milissegundo e coloca o valor antigo novamente.

Hejner
fonte
perfeito! Todas as outras soluções não funcionam para mim, apenas sua solução está funcionando para mim. Talvez porque eu esteja usando o php para atribuir valor à área de texto e o js não possa detectar o valor, portanto, o js deve aguardar 1 milissegundo.
precisa saber é o seguinte
3
@ zac1987 esse provavelmente não é o caso, pois o php renderizaria o html, o html seria carregado para o cliente e os js seriam executados. Provavelmente, você não está esperando por um evento pronto para documento.
reconbot
Apenas para salientar que o uso de setTimeout assim pode ser uma causa de resultado imprevisível. O código pode se comportar corretamente em algumas circunstâncias, como algumas vezes algo pode mudar a entrada durante 1 ms que o valor não será atrasado. Também é importante observar que 1ms de segundo é o tempo mínimo de espera. Portanto, se você tiver alguns métodos vinculados à CPU, o foco poderá esperar mais de 1 ms. Isso fará com que a interface do usuário não responda. E não deve ser necessário, pois o método .val () deve disparar as alterações da interface do usuário de qualquer maneira.
Loïc Faure-Lacroix
10

É 2019 e nenhum dos métodos acima funcionou para mim, mas este funcionou, retirado de https://css-tricks.com/snippets/javascript/move-cursor-to-end-of-input/

function moveCursorToEnd(id) {
  var el = document.getElementById(id) 
  el.focus()
  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();
  }
}
<input id="myinput" type="text" />
<a href="#" onclick="moveCursorToEnd('myinput')">Move cursor to end</a>

Andy Raddatz
fonte
1
Obrigado @MaxAlexanderHanna, eu só tinha el.focus()no, else ifentão não estava funcionando em alguns casos. Eu verifiquei que isso funciona agora no chrome e no (shudder) IE
Andy Raddatz
testado e funciona no IE e no CHROME em 12/07/2019. Obrigado, votado.
Max Alexander Hanna
Fantástico, isso funciona no Safari na versão beta da Catalina.
NetOperator Wibby
8

Simples. Ao editar ou alterar valores, primeiro coloque o foco e depois defina o valor.

$("#catg_name").focus();
$("#catg_name").val(catg_name);
Arun Prasad ES
fonte
O antigo padrão ainda funciona aqui no Chrome e no FF em 2016.
Volomike
1
Resposta perfeita.
Partha Paul
7

Ainda é necessária a variável intermediária (veja var val =), caso contrário o cursor se comporta de forma estranha, precisamos dela no final.

<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>
Adrian
fonte
6

el.setSelectionRange(-1, -1);

https://codesandbox.io/s/peaceful-bash-x2mti

Este método atualiza as propriedades HTMLInputElement.selectionStart, selectionEnd e selectionDirection em uma chamada.

https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange

Em outros métodos js, -1geralmente significa (para o) último caractere. Esse também é o caso deste, mas não consegui encontrar menção explícita desse comportamento nos documentos.

seeker_of_bacon
fonte
Isso funciona perfeitamente para mim e é o mais simples. +1
Chris Farr
Eu também tive que incluir onfocus = "this.value = this.value;" da resposta de Mike Berrow
Chris Farr
5

Para todos os navegadores para todos os casos:

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

Tempo limite necessário se você precisar mover o cursor do manipulador de eventos onFocus

terma
fonte
note que isso causa problemas no Android, porém, pois a seleção do intervalo coloca os dados no buffer do teclado, o que significa que qualquer tecla digitada acabará duplicando o texto na entrada, o que não é o mais útil.
Mike 'Pomax' Kamermans
1
Isso é incrível e funcionou demais para mim no ie! Eu tenho um monte de entradas que precisam de um scrollLeft e isso faz coisas estranhas, ou seja, então eu estava procurando por algo que eu pudesse usar para um calço e foi isso. Não funciona em outros navegadores, mas, por exemplo, onde nada funciona, isso é incrível!
zazvorniki 8/03/16
5

Gosto muito da resposta aceita, mas ela parou de funcionar no Chrome. No Chrome, para que o cursor chegue ao fim, o valor de entrada precisa ser alterado. A solução é a seguinte:

<input id="search" type="text" value="mycurrtext" size="30" 
   onfocus="var value = this.value; this.value = null; this.value = value;" name="search"/>
Konrad G
fonte
1
Esta é a solução que realmente funciona no Chrome para mim agora. A sintaxe é estranha, mas ei, vai aprender a viver com esta solução por enquanto!
Sam Bellerose
3

No jQuery, isso é

$(document).ready(function () {
  $('input').focus(function () {
    $(this).attr('value',$(this).attr('value'));
  }
}
Anônimo
fonte
2
Esta função atribuirá apenas o atributo value a valor quando $ ('input') receber foco. Não enviará o cursor para o final da linha.
vrish88
3

Esse problema é interessante. A coisa mais confusa é que nenhuma solução que encontrei resolveu o problema completamente.

+++++++ SOLUÇÃO +++++++

  1. Você precisa de uma função JS, assim:

    function moveCursorToEnd(obj) {
    
      if (!(obj.updating)) {
        obj.updating = true;
        var oldValue = obj.value;
        obj.value = '';
        setTimeout(function(){ obj.value = oldValue; obj.updating = false; }, 100);
      }
    
    }
  2. Você precisa ligar para esse cara nos eventos onfocus e onclick.

    <input type="text" value="Test Field" onfocus="moveCursorToEnd(this)" onclick="moveCursorToEnd(this)">

FUNCIONA EM TODOS OS DISPOSITIVOS E NAVEGADORES !!!!

Pedro Ferreira
fonte
2

Acabei de descobrir que, no iOS, a textarea.textContentpropriedade de configuração colocará o cursor no final do texto no elemento textarea toda vez. O comportamento foi um bug no meu aplicativo, mas parece ser algo que você pode usar intencionalmente.

Joey Guerra
fonte
2
var valsrch = $('#search').val();
$('#search').val('').focus().val(valsrch);
HanKrum
fonte
O que essa solução faz melhor do que a solução jQuery existente?
Rovanion
Essa é outra solução. Se você não tem permissão para editar arquivos html e apenas javascript, esta solução é melhor;) Eu tive a mesma situação!
HanKrum
essa solução funcionou para mim, a outra solução jQuery provavelmente não estava relacionada ao fato de você esvaziar o valor de entrada antes de focalizá-lo.
talsibony
2

Tomando algumas das respostas .. Criando um jquery de linha única.

$('#search').focus().val($('#search').val());
Ravi Ram
fonte
1

Se o campo de entrada precisar apenas de um valor padrão estático, normalmente faço isso com o jQuery:

$('#input').focus().val('Default value');

Isso parece funcionar em todos os navegadores.

Decko
fonte
1

Embora essa possa ser uma pergunta antiga com muitas respostas, deparei-me com um problema semelhante e nenhuma das respostas era exatamente o que eu queria e / ou foi mal explicada. O problema com as propriedades selectionStart e selectionEnd é que elas não existem para o número do tipo de entrada (enquanto a pergunta foi feita para o tipo de texto, acho que isso pode ajudar outras pessoas que possam ter outros tipos de entrada que precisam focar). Portanto, se você não souber se o tipo de entrada que a função focalizará é um número de tipo ou não, não poderá usar essa solução.

A solução que funciona em vários navegadores e para todos os tipos de entrada é bastante simples:

  • obter e armazenar o valor da entrada em uma variável
  • focalize a entrada
  • defina o valor da entrada para o valor armazenado

Dessa forma, o cursor está no final do elemento de entrada.
Então, tudo o que você faria é algo assim (usando jquery, desde que o seletor de elemento que se deseja focar seja acessível por meio do atributo de dados 'elemento de foco de dados' do elemento clicado e a função seja executada após clicar em '.foo' elemento):

$('.foo').click(function() {
    element_selector = $(this).attr('data-focus-element');
    $focus = $(element_selector);
    value = $focus.val();
    $focus.focus();
    $focus.val(value);
});

Por que isso funciona? Simplesmente, quando o .focus () é chamado, o foco será adicionado ao início do elemento de entrada (que é o principal problema aqui), ignorando o fato de que o elemento de entrada já possui um valor. No entanto, quando o valor de uma entrada é alterado, o cursor é automaticamente colocado no final do valor dentro do elemento de entrada. Portanto, se você substituir o valor pelo mesmo valor que foi inserido anteriormente na entrada, o valor parecerá intocado, o cursor, no entanto, será movido para o final.

l.varga
fonte
1

Experimente este funciona com Vanilla JavaScript.

<input type="text" id="yourId" onfocus=" let value = this.value; this.value = null; this.value=value" name="nameYouWant" class="yourClass" value="yourValue" placeholder="yourPlaceholder...">

Em Js

document.getElementById("yourId").focus()
Kishore Newton
fonte
0

Coloque o cursor quando clicar na área de texto no final do texto ... A variação deste código é ... TAMBÉM funciona! para Firefox, IE, Safari, Chrome ..

No código do servidor:

txtAddNoteMessage.Attributes.Add("onClick", "sendCursorToEnd('" & txtAddNoteMessage.ClientID & "');")

Em Javascript:

function sendCursorToEnd(obj) {
    var value =  $(obj).val(); //store the value of the element
    var message = "";
    if (value != "") {
        message = value + "\n";
     };
    $(obj).focus().val(message);
    $(obj).unbind();
 }
shirlymp
fonte
0

Se você definir o valor primeiro e depois o foco, o cursor sempre aparecerá no final.

$("#search-button").click(function (event) {
    event.preventDefault();
    $('#textbox').val('this');
    $("#textbox").focus();
    return false;
});

Aqui está o violino para testar https://jsfiddle.net/5on50caf/1/

Usman Shaukat
fonte
0

Eu queria colocar o cursor no final de um elemento "div" em que contenteditable = true e obtive uma solução com o código Xeoncross :

<input type="button" value="Paste HTML" onclick="document.getElementById('test').focus(); pasteHtmlAtCaret('<b>INSERTED</b>'); ">

<div id="test" contenteditable="true">
    Here is some nice text
</div>

E essa função faz mágica:

 function pasteHtmlAtCaret(html) {
    var sel, range;
    if (window.getSelection) {
        // IE9 and non-IE
        sel = window.getSelection();
        if (sel.getRangeAt && sel.rangeCount) {
            range = sel.getRangeAt(0);
            range.deleteContents();

            // Range.createContextualFragment() would be useful here but is
            // non-standard and not supported in all browsers (IE9, for one)
            var el = document.createElement("div");
            el.innerHTML = html;
            var frag = document.createDocumentFragment(), node, lastNode;
            while ( (node = el.firstChild) ) {
                lastNode = frag.appendChild(node);
            }
            range.insertNode(frag);

            // Preserve the selection
            if (lastNode) {
                range = range.cloneRange();
                range.setStartAfter(lastNode);
                range.collapse(true);
                sel.removeAllRanges();
                sel.addRange(range);
            }
        }
    } else if (document.selection && document.selection.type != "Control") {
        // IE < 9
        document.selection.createRange().pasteHTML(html);
    }
}

Funciona bem para a maioria dos navegadores, verifique, este código coloca o texto e coloca o foco no final do texto no elemento div (não no elemento de entrada)

https://jsfiddle.net/Xeoncross/4tUDk/

Obrigado, Xeoncross

Lexsoul
fonte
0

Eu também enfrentei o mesmo problema. Finalmente isso vai funcionar para mim:

jQuery.fn.putCursorAtEnd =  = function() {

  return this.each(function() {

    // Cache references
    var $el = $(this),
        el = this;

    // Only focus if input isn't already
    if (!$el.is(":focus")) {
     $el.focus();
    }

    // If this function exists... (IE 9+)
    if (el.setSelectionRange) {

      // Double the length because Opera is inconsistent about whether a carriage return is one character or two.
      var len = $el.val().length * 2;

      // Timeout seems to be required for Blink
      setTimeout(function() {
        el.setSelectionRange(len, len);
      }, 1);

    } else {

      // As a fallback, replace the contents with itself
      // Doesn't work in Chrome, but Chrome supports setSelectionRange
      $el.val($el.val());

    }

    // Scroll to the bottom, in case we're in a tall textarea
    // (Necessary for Firefox and Chrome)
    this.scrollTop = 999999;

  });

};

É assim que podemos chamar isso:

var searchInput = $("#searchInputOrTextarea");

searchInput
  .putCursorAtEnd() // should be chainable
  .on("focus", function() { // could be on any event
    searchInput.putCursorAtEnd()
  });

Funciona para mim no safari, IE, Chrome, Mozilla. Em dispositivos móveis, não tentei isso.

amku91
fonte
0

Verifique esta solução!

//fn setCurPosition
$.fn.setCurPosition = function(pos) {
    this.focus();
    this.each(function(index, elem) {
        if (elem.setSelectionRange) {
            elem.setSelectionRange(pos, pos);
        } else if (elem.createTextRange) {
            var range = elem.createTextRange();
            range.collapse(true);
            range.moveEnd('character', pos);
            range.moveStart('character', pos);
            range.select();
        }
    });
    return this;
};

// USAGE - Set Cursor ends
$('#str1').setCurPosition($('#str1').val().length);

// USAGE - Set Cursor at 7 position
// $('#str2').setCurPosition(7);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Set cursor at any position</p>
<p><input type="text" id="str1" value="my string here" /></p>
<p><input type="text" id="str2" value="my string here" /></p>

Roberto Godoy
fonte
0

Super fácil (talvez você precise se concentrar no elemento de entrada)

inputEl = getElementById('inputId');
var temp = inputEl.value;
inputEl.value = '';
inputEl.value = temp;
Eli
fonte
-1

Eu tentei as sugestões antes, mas nenhuma funcionou para mim (as testei no Chrome), então escrevi meu próprio código - e funciona bem no Firefox, IE, Safari, Chrome ...

Na área de texto:

onfocus() = sendCursorToEnd(this);

Em Javascript:

function sendCursorToEnd(obj) { 
var value = obj.value; //store the value of the element
var message = "";
if (value != "") {
    message = value + "\n";
};
$(obj).focus().val(message);}
shirlymp
fonte
-1

Aqui está uma demonstração do jsFiddle da minha resposta. A demonstração usa o CoffeeScript, mas você pode convertê-lo em JavaScript simples, se necessário.

A parte importante, em JavaScript:

var endIndex = textField.value.length;
if (textField.setSelectionRange) {
   textField.setSelectionRange(endIndex, endIndex);
}

Estou postando esta resposta porque já a escrevi para outra pessoa que teve a mesma pergunta. Essa resposta não cobre tantos casos extremos quanto as principais respostas aqui, mas funciona para mim e tem uma demonstração do jsFiddle com a qual você pode brincar.

Aqui está o código do jsFiddle, portanto, essa resposta é preservada mesmo se o jsFiddle desaparecer:

moveCursorToEnd = (textField) ->
  endIndex = textField.value.length
  if textField.setSelectionRange
    textField.setSelectionRange(endIndex, endIndex)

jQuery ->
  $('.that-field').on 'click', ->
    moveCursorToEnd(this)
<div class="field">
    <label for="pressure">Blood pressure</label>:
    <input class="that-field" type="text" name="pressure" id="pressure" value="24">
</div>
<p>
    Try clicking in the text field. The cursor will always jump to the end.
</p>
body {
    margin: 1em;
}

.field {
    margin-bottom: 1em;
}
Rory O'Kane
fonte
-1

Tente o seguinte código:

$('input').focus(function () {
    $(this).val($(this).val());
}).focus()
msroot
fonte
1
A adição de espaço em branco à direita é um efeito colateral que o OP indicou que deseja?
Charles Duffy
Mas por que minha resposta recebe -2? Eu não entendo! Isto é exemplos que funciona
msroot 9/15/15
Agora que você corrigiu o efeito colateral não especificado, é menos óbvio que isso está errado (no sentido de comportamento indesejado), mas eu posso entender por que ele teria sido rebaixado antes desse ponto. Neste ponto, a razão pela qual não estou votando é um desempenho potencialmente ruim - ler e escrever um valor de tamanho ilimitado pode ser lento; a setSelectionRangeabordagem é certamente muito mais eficiente quando / onde é suportada.
Charles Duffy
1
(Bem - isso, e não tenho certeza do que isso adiciona às respostas existentes que também funcionaram redefinindo o valor preexistente; se adicionar algo novo / importante, adicione algum texto descrevendo o que é isso, em vez de apenas código , ajudaria).
Charles Duffy
Claro - e o OP indicou na pergunta que eles queriam um espaço? Caso contrário, não faz parte da especificação; assim, "não especificado".
Charles Duffy
-1

Embora eu esteja respondendo tarde demais, mas para consultas futuras, será útil. E também funciona em contenteditablediv.

De onde você precisa definir o foco no final; escreva este código

var el = document.getElementById("your_element_id");
placeCaretAtEnd(el);

E a função é -

function placeCaretAtEnd(el) {
    el.focus();
    if (typeof window.getSelection != "undefined"
            && typeof document.createRange != "undefined") {
        var range = document.createRange();
        range.selectNodeContents(el);
        range.collapse(false);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else if (typeof document.body.createTextRange != "undefined") {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.collapse(false);
        textRange.select();
    }
}
Mahfuzur Rahman
fonte