2011-01-17 15 views
16

Ich habe ein Textfeld, und wenn ich in es klicken Ich mag so Something[caret]Javascript: zum letzten Zeichen Verschieben caret

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

die Cursor auf das letzte Zeichen zu bewegen, wie ich weiß, dass dies irgendwie möglich ist, mit das TextRange-Objekt, aber ich weiß nicht wirklich, wie man es benutzt

EDIT: Ich würde gerne nur reine Javascript-Lösungen sehen, so dass keine Bibliotheken bitte.

+7

Bitte tun Sie das nicht . Es ist höllisch nervig ** wenn Textfelder sowas machen. Wenn ich auf eine bestimmte Position klicke, erwarte ich, dass sich der Cursor an dieser Position befindet. nicht an irgendeiner Stelle mochte der Entwickler der Seite. Die automatische Auswahl aller Inhalte ist akzeptabler, solange sie sofort bei der Fokussierung erfolgt. – ThiefMaster

+0

@ThiefMaster, einverstanden, obwohl es manchmal seltsame Dinge gibt, die eine fein abgestimmte Steuerung erfordern. Beispiel: Ein Platzhalter-Polyfill, der den Dummy-Platzhaltertext wie diesen behandelt, existiert nicht. – KyleMit

Antwort

40

Die folgende Funktion wird in allen gängigen Browsern arbeiten, sowohl für Textfelder und Texteingaben:

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(); 
    } 
} 

Allerdings sollten Sie wirklich nicht tun, wenn der Benutzer auf das Textfeld klickt, da der Benutzer nicht in der Lage sein, den Caret mit der Maus zu bewegen. Tun Sie es stattdessen, wenn das Textfeld den Fokus erhält. Es gibt auch ein Problem in Chrome, die umgangen werden können wie folgt:

Voll Beispiel: 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

es funktioniert nicht auf IE9 – vsync

+0

@ vsync: Ich habe gerade versucht das JsFiddle Beispiel in IE 9 und es hat gut funktioniert. Welches Problem siehst du? –

+0

ho mein Schlechter! Entschuldigung, es funktioniert einfach gut :) – vsync