Use JavaScript para colocar el cursor al final del texto en el elemento de entrada de texto

308

¿Cuál es la mejor manera (y supongo que es la más simple) para colocar el cursor al final del texto en un elemento de texto de entrada a través de JavaScript, después de que se haya establecido el foco en el elemento?

Maní
fuente

Respuestas:

170

Me enfrenté a este mismo problema (después de establecer el enfoque a través de RJS / prototipo) en IE. Firefox ya estaba dejando el cursor al final cuando ya hay un valor para el campo. IE estaba forzando el cursor al comienzo del texto.

La solución a la que llegué es la siguiente:

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

Esto funciona tanto en IE7 como en FF3

Mike Berrow
fuente
3
¿Qué será para textarea?
Tareq
19
Funciona en Chrome ahora (9.0.597.98)
Matt
66
Esto ahora no funciona en IE9 : el cursor salta al comienzo del campo.
Ciudad
66
Tampoco funciona en FF 8. Sin embargo, la solución del chenosaurus parece funcionar.
Simon
3
funcionó para mí en Chrome 24.0.1312.57, IE 9.0.8112, pero no Firefox 18.0.2
Chris - Haddox Technologies
190

Hay una manera simple de hacerlo funcionar en la mayoría de los navegadores.

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

Sin embargo, debido a las peculiaridades * de algunos navegadores, una respuesta más inclusiva se parece más a esto

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

Usando jQuery (para configurar el oyente, pero de lo contrario no es necesario)

Usando Vanilla JS ( addEventfunción de préstamo de esta respuesta )


Extravagantes

Chrome tiene una peculiaridad extraña donde el evento de foco se dispara antes de que el cursor se mueva al campo; que arruina mi solución simple. Dos opciones para arreglar esto:

  1. Puede agregar un tiempo de espera de 0 ms (para diferir la operación hasta que la pila esté limpia )
  2. Puede cambiar el evento de focusa mouseup. Esto sería bastante molesto para el usuario a menos que aún mantuvieras un seguimiento del enfoque. No estoy realmente enamorado de ninguna de estas opciones.

Además, @vladkras señaló que algunas versiones anteriores de Opera calculan incorrectamente la longitud cuando tiene espacios. Para esto, puede usar un número enorme que debería ser más grande que su cadena.

Gary
fuente
2
funcionó para mí en Chrome 24.0.1312.57, IE 9.0.8112 y Firefox 18.0.2
Chris - Haddox Technologies
44
Esta es una buena solución en lugar de una observación (kludge), es menos código y es más comprensible que las alternativas discutidas aquí. Gracias.
Derek Litz
Prefiero hacer eso solo para el primer evento de enfoque, y llamarlo de inmediato. De lo contrario, cada vez que haga clic en el campo, el cursor se moverá hasta el final.
Damien
this.selectionStart = this.selectionEnd = 0; Esto debería mover el foco antes de la primera letra del cuadro de entrada. Pero más bien, cuando depuré, ¡ni siquiera está cambiando el valor de selectionEnd y selectionStart! ¡Y tampoco lo mueves al primer personaje!
soham
1
Se informaba que Opera funcionaba incorrectamente a veces selectionStarty lengthdevolvía un número menor en los espacios. Es por eso que uso 10000o cualquier otro número lo suficientemente grande en lugar de this.value.length(probado en IE8 e IE11)
vladkras
160

Prueba esto, me ha funcionado:

//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 el cursor se mueva hasta el final, la entrada debe tener el foco primero, luego, cuando se cambia el valor, irá al final. Si establece .value en el mismo, no cambiará en Chrome.

Chenosaurus
fuente
2
Esto es como onfocus = "this.value = this.value;
Tareq
15
Establecer el enfoque antes de establecer el valor es la clave para que funcione en Chrome.
anatoly techtonik
77
¿Por qué poner this.delante de la entrada en las líneas 2, 3 y 4? Ya sabemos que ese inputes el elemento de entrada. Usar thisparece redundante. Buena solución de lo contrario!
The111
3
@Tareq No son lo mismo. Este truco es mucho mejor que la respuesta aceptada.
Lewis
44
Más fácil:$input.focus().val($input.val());
milkovsky
99

Después de hackear esto un poco, encontré que la mejor manera era usar el setSelectionRange función si el navegador lo admite; si no, vuelva a usar el método en la respuesta de Mike Berrow (es decir, reemplace el valor por sí mismo).

También estoy configurando scrollTopun valor alto en caso de que estemos en un desplazamiento vertical textarea. (Usar un valor alto arbitrario parece más confiable que $(this).height()en Firefox y Chrome).

Lo hice como un complemento jQuery. (Si no está utilizando jQuery, confío en que aún puede obtener la esencia lo suficientemente fácil).

He probado en IE6, IE7, IE8, Firefox 3.5.5, Google Chrome 3.0, Safari 4.0.4, Opera 10.00.

Está disponible en jquery.com como el complemento PutCursorAtEnd . Para su comodidad, el código para la versión 1.0 es el siguiente:

// 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
fuente
44
¿Por qué calcular la longitud? ¿Por qué no solo this.setSelectionRange (9999,9999) si vas a sobrepasarlo de todos modos?
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>  

Esta función me funciona en IE9, Firefox 6.xy Opera 11.x

Hallgeir Engen
fuente
Genial, la primera solución lista que parece funcionar tanto para FF6 como para IE8.
Simon
3
Por alguna razón, la respuesta popular no funcionó para mí. Esto funcionó perfecto.
metric152
No funciona para mí en IE9. Error:SCRIPT16389: Unspecified error.
soham
1
Funciona perfectamente en FF 46, Chrome 51 e IE 11.
webdevguy
Esto funciona en IE 8 mientras que alguna otra opción no. Gracias.
BenMaddox
17

He intentado lo siguiente con bastante éxito en Chrome

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

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

Resumen rápido:

Toma cada campo de entrada con el foco de la clase en él, luego almacena el valor anterior del campo de entrada en una variable, luego aplica la cadena vacía al campo de entrada.

Luego espera 1 milisegundo y vuelve a poner el valor anterior.

Hejner
fuente
¡Perfecto! Todas las demás soluciones no me funcionan, solo tu solución me funciona. Tal vez porque estoy usando php para asignar valor a textarea, y js no puede detectar el valor, por lo que js debe esperar 1 milisegundo.
zac1987
3
@ zac1987 probablemente ese no sea el caso, ya que php representaría el html, el html se cargaría al cliente y luego se ejecutaría el js. Es probable que no esté esperando un evento listo para documentos.
Reconbot
Solo para señalar que usar setTimeout como ese puede ser una causa de resultados impredecibles. El código podría comportarse correctamente en algunas circunstancias, como a veces algo podría cambiar la entrada durante ese 1 ms que el valor no se restablecerá. También es importante tener en cuenta que 1 ms de segundo es el tiempo mínimo de espera. Entonces, si tiene algunos métodos vinculados a la CPU, el enfoque puede esperar más de 1 ms. Esto hará que la IU no responda. Y no debería ser necesario ya que el método .val () debería desencadenar cambios en la interfaz de usuario de todos modos.
Loïc Faure-Lacroix
10

Es 2019 y ninguno de los métodos anteriores funcionó para mí, pero este lo hizo, tomado 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
fuente
1
Gracias @MaxAlexanderHanna, solo tuve el.focus()en el, else ifasí que no funcionó en algunos casos. Verifiqué que esto funciona ahora en Chrome y (estremecimiento) IE
Andy Raddatz
probado y funciona tanto en IE como en CHROME a partir del 7/12/2019. Gracias, votado.
Max Alexander Hanna
Fantástico, esto funciona en Safari en la beta de Catalina.
NetOperator Wibby
8

Sencillo. Al editar o cambiar valores, primero ponga el foco y luego ajuste el valor.

$("#catg_name").focus();
$("#catg_name").val(catg_name);
Arun Prasad ES
fuente
El viejo estándar todavía funciona aquí en Chrome y FF en 2016.
Volomike
1
Respuesta perfecta.
Partha Paul
7

Todavía se necesita la variable intermedia, (ver var val =) de lo contrario el cursor se comporta de manera extraña, lo necesitamos al 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
fuente
6

el.setSelectionRange(-1, -1);

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

Este método actualiza las propiedades HTMLInputElement.selectionStart, selectionEnd y selectionDirection en una llamada.

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

En otros métodos js -1generalmente significa (para) el último carácter. Este es el caso de este también, pero no pude encontrar una mención explícita de este comportamiento en los documentos.

buscador de tocino
fuente
Esto funciona perfectamente para mí y es lo más simple. +1
Chris Farr
También tuve que incluir onfocus = "this.value = this.value;" de la respuesta de Mike Berrow
Chris Farr
5

Para todos los navegadores para todos los 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);
}

Se requiere tiempo de espera si necesita mover el cursor desde el controlador de eventos onFocus

terma
fuente
Sin embargo, tenga en cuenta que esto causa problemas en Android, ya que la selección de rango coloca los datos en el búfer del teclado, lo que significa que cualquier tecla que escriba terminará duplicando el texto en la entrada, lo que no es lo más útil.
Mike 'Pomax' Kamermans
1
¡Esto es increíble y funcionó increíble para mí, es decir! Tengo un montón de entradas que necesitan un scrollLeft y eso hace cosas raras, es decir, estaba buscando algo que pudiera usar para una cuña y esto fue todo. No funciona en otros navegadores, pero es decir, donde nada funciona, ¡es increíble!
zazvorniki
5

Me gusta mucho la respuesta aceptada, pero dejó de funcionar en Chrome. En Chrome, para que el cursor llegue al final, el valor de entrada debe cambiar. La solución es la siguiente:

<input id="search" type="text" value="mycurrtext" size="30" 
   onfocus="var value = this.value; this.value = null; this.value = value;" name="search"/>
Konrad G
fuente
1
Esta es la solución que realmente funciona en Chrome para mí ahora. La sintaxis es extraña pero bueno, ¡aprenderá a vivir con esta solución por ahora!
Sam Bellerose el
3

En jQuery, eso es

$(document).ready(function () {
  $('input').focus(function () {
    $(this).attr('value',$(this).attr('value'));
  }
}
Anónimo
fuente
2
Esta función solo asignará el atributo value a value cuando $ ('input') recibe el foco. No enviará el cursor al final de la línea.
vrish88
3

Este problema es interesante Lo más confuso al respecto es que ninguna solución que encontré resolvió el problema por completo.

+++++++ SOLUCIÓN +++++++

  1. Necesita una función JS, como esta:

    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. Necesitas llamar a este tipo en los eventos onfocus y onclick.

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

¡FUNCIONA EN TODOS LOS DISPOSITIVOS Y NAVEGADORES!

Pedro Ferreira
fuente
2

Acabo de descubrir que en iOS, la textarea.textContentpropiedad de configuración colocará el cursor al final del texto en el elemento textarea cada vez. El comportamiento fue un error en mi aplicación, pero parece ser algo que podría usar intencionalmente.

Joey Guerra
fuente
2
var valsrch = $('#search').val();
$('#search').val('').focus().val(valsrch);
HanKrum
fuente
¿Qué hace esta solución mejor que la solución jQuery existente?
Rovanion
Esta es otra solución. Si no tiene permiso para redactar archivos html y solo javascript, esta solución es mejor;) ¡Tuve la misma situación!
HanKrum
esta solución funcionó para mí, la otra solución jQuery probablemente no se relacionó con el hecho de que vacías el valor de entrada antes de enfocarlo.
talsibony
2

Tomando algunas de las respuestas ... haciendo un jquery de una sola línea.

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

Si el campo de entrada solo necesita un valor predeterminado estático, generalmente hago esto con jQuery:

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

Esto parece funcionar en todos los navegadores.

Decko
fuente
1

Si bien esta puede ser una pregunta antigua con muchas respuestas, me encontré con un problema similar y ninguna de las respuestas fue exactamente lo que quería y / o me explicaron mal. El problema con las propiedades selectionStart y selectionEnd es que no existen para el número de tipo de entrada (aunque se hizo la pregunta para el tipo de texto, creo que podría ayudar a otros que podrían tener otros tipos de entrada que necesitan enfocar). Entonces, si no sabe si el tipo de entrada que enfocará la función es un número de tipo o no, no puede usar esa solución.

La solución que funciona entre navegadores y para todos los tipos de entrada es bastante simple:

  • obtener y almacenar el valor de entrada en una variable
  • enfocar la entrada
  • establecer el valor de entrada al valor almacenado

De esa manera, el cursor está al final del elemento de entrada.
Entonces, todo lo que haría es algo como esto (usando jquery, siempre que se pueda acceder al selector de elementos que se desea enfocar a través del atributo de datos 'elemento de enfoque de datos' del elemento seleccionado y la función se ejecuta después de hacer clic en '.foo' elemento):

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

¿Por qué funciona esto? Simplemente, cuando se llama a .focus (), el foco se agregará al comienzo del elemento de entrada (que es el problema central aquí), ignorando el hecho de que el elemento de entrada ya tiene un valor. Sin embargo, cuando se cambia el valor de una entrada, el cursor se coloca automáticamente al final del valor dentro del elemento de entrada. Entonces, si anula el valor con el mismo valor que se había ingresado previamente en la entrada, el valor se verá intacto, sin embargo, el cursor se moverá hasta el final.

l.varga
fuente
1

Pruebe este funciona con 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...">

En js

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

Coloque el cursor cuando haga clic en el área de texto al final del texto ... La variación de este código es ... ¡TAMBIÉN funciona! para Firefox, IE, Safari, Chrome ..

En el código del lado del servidor:

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

En 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
fuente
0

Si establece el valor primero y luego establece el foco, el cursor siempre aparecerá al final.

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

Aquí está el violín para probar https://jsfiddle.net/5on50caf/1/

Usman Shaukat
fuente
0

Quería poner el cursor al final de un elemento "div" donde contenteditable = true, y obtuve una solución con el 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>

Y esta función hace magia:

 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 bien para la mayoría de los navegadores, verifíquelo, este código coloca el texto y pone el foco al final del texto en el elemento div (no en el elemento de entrada)

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

Gracias Xeoncross

Lexsoul
fuente
0

También me enfrenté al mismo problema. Finalmente esto va a funcionar para mí:

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;

  });

};

Así es como podemos llamar a esto:

var searchInput = $("#searchInputOrTextarea");

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

Me funciona en safari, IE, Chrome, Mozilla. En dispositivos móviles no probé esto.

amku91
fuente
0

¡Comprueba esta solución!

//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
fuente
0

Súper fácil (puede que tenga que centrarse en el elemento de entrada)

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

Intenté las sugerencias antes, pero ninguna funcionó para mí (las probé en Chrome), así que escribí mi propio código, y funciona bien en Firefox, IE, Safari, Chrome ...

En Textarea:

onfocus() = sendCursorToEnd(this);

En 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
fuente
-1

Aquí hay una demostración de jsFiddle de mi respuesta. La demostración utiliza CoffeeScript, pero puede convertirlo a JavaScript simple si es necesario.

La parte importante, en JavaScript:

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

Estoy publicando esta respuesta porque ya la escribí para otra persona que tenía la misma pregunta. Esta respuesta no cubre tantos casos extremos como las respuestas principales aquí, pero funciona para mí y tiene una demo jsFiddle con la que puedes jugar.

Aquí está el código de jsFiddle, por lo que esta respuesta se conserva incluso si jsFiddle desaparece:

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
fuente
-1

Prueba el siguiente código:

$('input').focus(function () {
    $(this).val($(this).val());
}).focus()
msroot
fuente
1
¿Agregar espacios en blanco al final es un efecto secundario que el OP ha indicado que desean?
Charles Duffy
¿Pero por qué mi respuesta obtiene -2? No lo entiendo! Estos son ejemplos que funciona
msroot el
Ahora que solucionó el efecto secundario no especificado, es menos obvio que está mal (en el sentido del comportamiento no deseado), pero puedo entender por qué se habría rechazado antes de ese punto. En este punto, la razón por la que no estoy votando es un rendimiento potencialmente pobre: ​​leer y escribir un valor de longitud ilimitada tiene el potencial de ser lento; el setSelectionRangeenfoque es ciertamente mucho más eficiente cuando / donde sea compatible.
Charles Duffy
1
(Bueno, eso, y no estoy seguro de qué agrega a las respuestas existentes que también funcionaron al restablecer el valor preexistente; si agrega algo nuevo / importante, agrega algo de texto que describa qué es eso, en lugar de solo código , ayudaría).
Charles Duffy
Claro, ¿y el OP indicó en la pregunta que querían un espacio? Si no, no es parte de la especificación; por lo tanto, "no especificado".
Charles Duffy
-1

Aunque estoy respondiendo demasiado tarde, pero para futuras consultas, será útil. Y también funciona encontenteditable div.

Desde donde necesita establecer el foco al final; escribe este código

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

Y la función es -

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
fuente