Como realmente necesitaba esta solución, y la solución de línea de base típica ( enfocar la entrada, luego establecer el valor igual a sí mismo ) no funciona en varios navegadores , pasé un tiempo ajustando y editando todo para que funcione. Sobre la base del código de @ kd7 , esto es lo que se me ocurrió.
¡Disfrutar! Funciona en IE6 +, Firefox, Chrome, Safari, Opera
Técnica de posicionamiento de intercalación entre navegadores (ejemplo: mover el cursor al FIN)
// ** USEAGE ** (returns a boolean true/false if it worked or not)
// Parameters ( Id_of_element, caretPosition_you_want)
setCaretPosition('IDHERE', 10); // example
La carne y las papas son básicamente setCaretPosition de @ kd7 , con el mayor ajuste if (el.selectionStart || el.selectionStart === 0)
, en firefox, la selección Start está comenzando en 0 , que en booleano, por supuesto, se está convirtiendo en False, por lo que se rompió allí.
En Chrome, el mayor problema era que simplemente no .focus()
era suficiente (¡seguía seleccionando TODO el texto!) Por lo tanto, establecemos el valor de sí mismo, el.value = el.value;
antes de llamar a nuestra función, y ahora tiene una comprensión y posición con el entrada para usar selectionStart .
function setCaretPosition(elemId, caretPos) {
var el = document.getElementById(elemId);
el.value = el.value;
// ^ this is used to not only get "focus", but
// to make sure we don't have it everything -selected-
// (it causes an issue in chrome, and having it doesn't hurt any other browser)
if (el !== null) {
if (el.createTextRange) {
var range = el.createTextRange();
range.move('character', caretPos);
range.select();
return true;
}
else {
// (el.selectionStart === 0 added for Firefox bug)
if (el.selectionStart || el.selectionStart === 0) {
el.focus();
el.setSelectionRange(caretPos, caretPos);
return true;
}
else { // fail city, fortunately this never happens (as far as I've tested) :)
el.focus();
return false;
}
}
}
}
if(elem.selectionStart)
se rompe cuando selectionStart es 0, como también lo señala la respuesta de jhnns.