Sorry, ya lo he solucionado, quité codigo de las FAQ, pensaba que no tenía sentido quitarle y ponerle el mismo value al input. Hay que hacer el createRange() con el campo vacío, yo que sé por qué.
Bueno, ya se puede hacer:
Código PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title></title>
<meta name="Author" content="derkeNuke">
</head>
<body>
<input type="text" id="caja" value="0123456789" />
<input type="button" value="pos(3)" onclick="ponCursorEnPos(3)" />
<br/>
<script>
//función para escribir DEBUG
function e(q,noBr) {
document.body.appendChild( document.createTextNode(q) );
if(!noBr) document.body.appendChild( document.createElement("BR") );
}
var laCaja=document.getElementById("caja");
//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){
e("ponCursorEnPos: Con IE coloco el cursor en la posición "+pos);
var tex=laCaja.value;
laCaja.value='';
forzar_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'){
e("ponCursorEnPos: Con Firefox u otro coloco el cursor en la posición "+pos);
laCaja.setSelectionRange(pos,pos);
forzar_focus();
}
}
function focus_handler() {
e("focus_handler: he saltado por el evento focus()");
ponCursorEnPos(2);
//setTimeout("ponCursorEnPos(2)",1000);
return false;
}
//hace el focus sin saltar el evento onfocus, es decir, sin saltar focus_handler
function forzar_focus() {
e("Fuerzo el focus sin que salte el evento onfocus");
laCaja.onfocus=null; //quito
laCaja.focus(); //hago
setTimeout("laCaja.onfocus=focus_handler",1); //pongo (retrasado para IE...)
}
laCaja.onfocus=focus_handler;
</script>
</body>
</html>
Saludos.