Yo he estado jugando con lo mismo, y funciona en inputs, pero no lo he probado en <textarea>. Es parecido a lo que te comenta Panino (
)
Bien, aquí tienes
getCursorPos(campo) que fíjate en lo que te devuelve:
Código PHP:
/********
getCursorPos: Me devuelve la posición de inicio y fin de la selección o la posición del | en el campo
********/
function getCursorPos(campo) {
if (document.selection) {// IE Support
campo.focus(); // Set focus on the element
var oSel = document.selection.createRange(); // To get cursor position, get empty selection range
oSel.moveStart('character', -campo.value.length); // Move selection start to 0 position
campo.selectionEnd = oSel.text.length; // The caret position is selection length
oSel.setEndPoint('EndToStart', document.selection.createRange() );
campo.selectionStart = oSel.text.length;
}
return { start: campo.selectionStart, end: campo.selectionEnd };
}
Es un objeto con dos propiedades,
start y
end (inicio y fin de la selección en el campo. Si no hay nada seleccionado,
start será igual a
end, la posición del cursor en el campo. Me ha sido muy útil para el desafío1. Funciona en IE y en FF.
Luego también querías colocar el cursor en una posición dada:
Código PHP:
/********
COLOCACIÓN DEL CURSOR: Da el foco a la caja colocando el cursor de inserción en la posición pos
********/
function ponCursorEnPos(pos){
if(typeof document.selection != 'undefined' && document.selection){ //método IE
var tex=laCaja.value;
laCaja.value='';
laCaja.focus();
var str = document.selection.createRange();
laCaja.value=tex;
str.move("character", pos);
str.moveEnd("character", 0);
str.select();
}
else if(typeof laCaja.selectionStart != 'undefined'){ //método estándar
laCaja.setSelectionRange(pos,pos);
forzar_focus(); //debería ser focus(), pero nos salta el evento y no queremos
}
}
Lo único que aquí no lo tengo en genérico, hay que utilizar la variable global
laCaja, o modificar la función para pasársela por parámetro, pero esta tirado. También es para IE y FF. También es fácil modificarlo para crear selecciones, en vez de colocar el cursor. Es intuitivo (
str.moveEnd("character",x) y
laCaja.setSelectionRange(pos,pos+x); ).
Aviso que en Opera he leído que hay problemas, porque utiliza el método estándar, pero da true en
document.selection o algo parecido...
Un saludo Calisco