Establecer la posición del cursor del teclado en el cuadro de texto html

Resuelto jonhobbs asked hace 15 años • 11 respuestas

¿Alguien sabe cómo mover el cursor del teclado en un cuadro de texto a una posición particular?

Por ejemplo, si un cuadro de texto (por ejemplo, un elemento de entrada, no un área de texto) tiene 50 caracteres y quiero colocar el símbolo de intercalación antes del carácter 20, ¿cómo lo haría?

Esto se diferencia de esta pregunta: jQuery Establecer la posición del cursor en el área de texto , que requiere jQuery.

jonhobbs avatar Feb 05 '09 00:02 jonhobbs
Aceptado

Extraído de Configuración del cursor del teclado de Josh Stodola Posición en un cuadro de texto o área de texto con Javascript

Una función genérica que te permitirá insertar el cursor en cualquier posición de un cuadro de texto o área de texto que desees:

function setCaretPosition(elemId, caretPos) {
    var elem = document.getElementById(elemId);

    if(elem != null) {
        if(elem.createTextRange) {
            var range = elem.createTextRange();
            range.move('character', caretPos);
            range.select();
        }
        else {
            if(elem.selectionStart) {
                elem.focus();
                elem.setSelectionRange(caretPos, caretPos);
            }
            else
                elem.focus();
        }
    }
}

El primer parámetro esperado es el ID del elemento en el que desea insertar el cursor del teclado. Si no se puede encontrar el elemento, no pasará nada (obviamente). El segundo parámetro es el índice de posición del cursor. Zero pondrá el cursor del teclado al principio. Si pasa un número mayor que el número de caracteres en el valor del elemento, se colocará el cursor del teclado al final.

Probado en IE6 y versiones posteriores, Firefox 2, Opera 8, Netscape 9, SeaMonkey y Safari. Desafortunadamente, en Safari no funciona en combinación con el evento onfocus).

Un ejemplo del uso de la función anterior para forzar que el cursor del teclado salte al final de todas las áreas de texto de la página cuando reciben el foco:

function addLoadEvent(func) {
    if(typeof window.onload != 'function') {
        window.onload = func;
    }
    else {
        if(func) {
            var oldLoad = window.onload;

            window.onload = function() {
                if(oldLoad)
                        oldLoad();

                func();
            }
        }
    }
}

// The setCaretPosition function belongs right here!

function setTextAreasOnFocus() {
/***
 * This function will force the keyboard caret to be positioned
 * at the end of all textareas when they receive focus.
 */
    var textAreas = document.getElementsByTagName('textarea');

    for(var i = 0; i < textAreas.length; i++) {
        textAreas[i].onfocus = function() {
            setCaretPosition(this.id, this.value.length);
        }
    }

    textAreas = null;
}

addLoadEvent(setTextAreasOnFocus);
Ta01 avatar Feb 04 '2009 17:02 Ta01

El enlace en la respuesta está roto, este debería funcionar (todos los créditos van a blog.vishalon.net ):

http://snipplr.com/view/5144/getset-cursor-in-html-textarea/

En caso de que el código se vuelva a perder, estas son las dos funciones principales:

function doGetCaretPosition(ctrl)
{
 var CaretPos = 0;

 if (ctrl.selectionStart || ctrl.selectionStart == 0)
 {// Standard.
  CaretPos = ctrl.selectionStart;
 }
 else if (document.selection)
 {// Legacy IE
  ctrl.focus ();
  var Sel = document.selection.createRange ();
  Sel.moveStart ('character', -ctrl.value.length);
  CaretPos = Sel.text.length;
 }

 return (CaretPos);
}


function setCaretPosition(ctrl,pos)
{
 if (ctrl.setSelectionRange)
 {
  ctrl.focus();
  ctrl.setSelectionRange(pos,pos);
 }
 else if (ctrl.createTextRange)
 {
  var range = ctrl.createTextRange();
  range.collapse(true);
  range.moveEnd('character', pos);
  range.moveStart('character', pos);
  range.select();
 }
}
eternal avatar Nov 29 '2010 10:11 eternal