2011-01-17 7 views
16

ho una textarea e quando clicco in essa voglio spostare il cursore fino all'ultimo carattere in modo Something[caret]Javascript: Spostare cursore all'ultimo carattere

function moveCaret(){ 
    // Move caret to the last character 
} 
<textarea onclick="moveCaret();"> 
    Something 
</textarea> 

Come So che questo è in qualche modo possibile con l'oggetto TextRange, ma non so davvero come usarlo

EDIT: Mi piacerebbe vedere solo le soluzioni javascript pure, quindi nessuna libreria per favore.

+7

Si prega di non farlo . È ** fastidioso come l'inferno ** se i campi di testo fanno cose del genere. Se clicco in una determinata posizione, mi aspetto che il cursore si trovi in ​​questa posizione; non in una posizione che piacesse allo sviluppatore del sito. La selezione automatica di tutti i contenuti è più accettabile a condizione che si verifichi immediatamente quando la si mette a fuoco. – ThiefMaster

+0

@ThiefMaster, d'accordo, anche se a volte ci sono cose strane che richiedono un controllo accurato. Ad esempio, un polyfill segnaposto che considera il testo fittizio segnaposto come non esiste. – KyleMit

risposta

40

La seguente funzione funzionerà in tutti i principali browser, sia per le textarea e gli ingressi di testo:

function moveCaretToEnd(el) { 
    if (typeof el.selectionStart == "number") { 
     el.selectionStart = el.selectionEnd = el.value.length; 
    } else if (typeof el.createTextRange != "undefined") { 
     el.focus(); 
     var range = el.createTextRange(); 
     range.collapse(false); 
     range.select(); 
    } 
} 

Tuttavia, davvero non dovrebbe fare questo ogni volta che l'utente fa clic sul textarea, in quanto l'utente non lo farà essere in grado di spostare il cursore con il mouse. Invece, fallo quando la textarea riceve lo stato attivo. V'è anche un problema in Chrome, che può essere aggirato come segue:

esempio completa: http://www.jsfiddle.net/ghAB9/3/

HTML:

<textarea id="test">Something</textarea> 

Script:

var textarea = document.getElementById("test"); 
textarea.onfocus = function() { 
    moveCaretToEnd(textarea); 

    // Work around Chrome's little problem 
    window.setTimeout(function() { 
     moveCaretToEnd(textarea); 
    }, 1); 
}; 
+0

non funziona su IE9 – vsync

+0

@vsync: ho appena provato l'esempio jsFiddle in IE 9 e ha funzionato correttamente. Che problema vedi? –

+0

ho il mio male! scusa, funziona bene :) – vsync