Poiché in realtà avevo davvero bisogno di questa soluzione e la tipica soluzione di base ( focalizzare l'input - quindi impostare il valore uguale a se stessa ) non funziona su più browser , ho trascorso un po 'di tempo a modificare e modificare tutto per farlo funzionare. Basandomi sul codice di @ kd7 , ecco cosa ho escogitato.
Godere! Funziona in IE6 +, Firefox, Chrome, Safari, Opera
Tecnica di posizionamento del cursore cross-browser (esempio: spostamento del cursore su END)
// ** USEAGE ** (returns a boolean true/false if it worked or not)
// Parameters ( Id_of_element, caretPosition_you_want)
setCaretPosition('IDHERE', 10); // example
La carne e le patate sono fondamentalmente il setCaretPosition di @ kd7 , con il più grande tweak che è if (el.selectionStart || el.selectionStart === 0)
, in firefox la selezioneStart inizia da 0 , che in booleano ovviamente si sta trasformando in False, quindi si stava rompendo lì.
In Chrome il problema più grande era che il solo dare non .focus()
era abbastanza (continuava a selezionare TUTTO il testo!) Quindi, abbiamo impostato il valore di se stesso, su se stesso el.value = el.value;
prima di chiamare la nostra funzione, e ora ha una comprensione e una posizione con il input per usare 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)
si interrompe quando selectionStart è 0 come indicato anche dalla risposta di jhnns.